我在Spring引导上有一个项目,并尝试使用@Transactional和协程,但出现错误
org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException.
现在可以使用@Transactional和协程吗?
override suspend fun invoke() {
val result = withContext(Dispatchers.IO) { deactivate() }
}
@Transactional
private suspend fun deactivate(): Int {
//data base call 1
//data base call 2
// ...
}
答案 0 :(得分:0)
在@Transactional
方法调用期间,您无法启动在不同线程上执行事务性工作的协程。
@Transactional
导致代码被拦截。在deactivate()
之前和之后,将为您调用与交易相关的代码。
因为协程可以在其他线程上启动,所以它们将在这些事务调用之外启动。
相关StackOverflow主题:Spring - @Transactional - What happens in background?
答案 1 :(得分:0)
将方法包装在事务中的原因是为了确保该方法在数据库级别是原子的,并且当出现故障时,整个事务将恢复,就好像它从未发生过一样。
通过中断事务,使用协程,如果您执行任何其他数据库操作,您会破坏方法的原子性,并且当出现故障时,协程的这些操作将不会恢复。
希望你在使用这种(反)模式时要小心!