Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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
    // ...
}
like image 595
kirill Avatar asked Oct 27 '25 06:10

kirill


2 Answers

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?

like image 71
Byte Welder Avatar answered Oct 30 '25 08:10

Byte Welder


Since version 5.3.0, support for suspending functions annotated with @Transactional has been added

Release notes: https://github.com/spring-projects/spring-framework/releases/tag/v5.3.0

Commit:
https://github.com/spring-projects/spring-framework/commit/5429c7afebaa3255ea80197224023c29c7d552ec

And since version v6.1.0-M5, compatibility of suspending functions with Spring AOP has been added:

https://github.com/spring-projects/spring-framework/releases/tag/v6.1.0-M5

Commit:
https://github.com/spring-projects/spring-framework/commit/c8169e5cad0bd616e251aa9c004eb2cdca081a59

Issue:
https://github.com/spring-projects/spring-framework/issues/22462

like image 44
gearbase Avatar answered Oct 30 '25 08:10

gearbase