springspring-bootkotlinkotlin-coroutines

Is it possible to use @Transactional and kotlin coroutines in spring boot?


I have a project on Spring boot and tried to use @Transactional and coroutines and got an error

org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException.

Is it possible to use @Transactional and coroutines now?

override suspend fun invoke() {
    val result = withContext(Dispatchers.IO) { deactivate() }
} 

@Transactional
private suspend fun deactivate(): Int {
    //data base call 1
    //data base call 2
    // ...
}

Solution

  • You can't start coroutines that do transactional work on a different thread during a @Transactional method call.

    @Transactional leads to code being intercepted. Before and after deactivate(), the transaction-related code will be called for you. Because the coroutines could be launched on a different thread, they will be launched outside of these transaction calls.

    Relevant StackOverflow topic: Spring - @Transactional - What happens in background?