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
// ...
}
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?