Transactions in R2BC for MYSQL using dev.miku

680 Views Asked by At

I was trying to implement simple transaction mechanism just to check how it works in reactive world using dev.miku for Mysql but getting below error

Receiver class dev.miku.r2dbc.mysql.MySqlConnection does not define or inherit an implementation of the resolved method 'abstract org.reactivestreams.Publisher beginTransaction(io.r2dbc.spi.TransactionDefinition)' 

Code I have written is as below

@Autowired
private TransactionalOperator operator;

public Mono<ServerResponse> insertUserData(ServerRequest serverRequest) {
    return serverRequest.bodyToMono(UserAndFamilyRequest.class)
            .flatMap(saveFamilyMembers())
            .as(operator::transactional)  //using transactional operator
            .flatMap(familyMemberEntity -> ServerResponse.ok()
                    .contentType(MediaType.APPLICATION_JSON)
                    .bodyValue(familyMemberEntity));
}


private Function<UserAndFamilyRequest, Mono<List<FamilyMemberEntity>>> saveFamilyMembers() {
    return userAndFamilyRequest -> {
        User user = userAndFamilyRequest.getUser();
        UserEntity userEntity = new UserEntity();
        userEntity.setName(user.getName());
        userEntity.setAge(user.getAge());
        userEntity.setSeats(user.getSeats());
        userRepo.save(userEntity);
        List<FamilyMember> list = userAndFamilyRequest.getFamilyMemberList();
        var entityList = list.stream().map(familyMember -> {
            FamilyMemberEntity familyMemberEntity = new FamilyMemberEntity();
            familyMemberEntity.setName(familyMember.getName());
            familyMemberEntity.setAge(familyMember.getAge());
            return familyMemberEntity;
        }).collect(Collectors.toList());
        return familyRepo.saveAll(entityList).collect(Collectors.toList());
    };
}

I have tried annotation the method insertUserData with @Transactional but getting the same error. Using below dependency

<dependency>
            <groupId>dev.miku</groupId>
            <artifactId>r2dbc-mysql</artifactId>
            <version>0.8.2.RELEASE</version>
</dependency>

Do I need to import some other dependency for my purpose, or Am i doing something wrong

1

There are 1 best solutions below

0
jchrys On

The root cause of your issue is that dev.miku:r2dbc-mysql:0.8.2 does not implement the beginTransaction(TransactionDefinition) method. This version of r2dbc-mysql is quite outdated (3 years old as of now) and is no longer maintained.

I suggest trying either io.asyncer:r2dbc-mysql:0.9.1 or io.asyncer:r2dbc-mysql:1.0.0, depending on your Spring Data version. io.asyncer:r2dbc-mysql is the official successor to dev.miku:r2dbc-mysql.