如何解决是否可以在春季靴中使用@Transactional和kotlin协程?
我在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
// ...
}
解决方法
在@Transactional
方法调用期间,您无法启动在不同线程上执行事务性工作的协程。
@Transactional
导致代码被拦截。在deactivate()
之前和之后,将为您调用与交易相关的代码。
因为协程可以在其他线程上启动,所以它们将在这些事务调用之外启动。
相关StackOverflow主题:Spring - @Transactional - What happens in background?
,将方法包装在事务中的原因是为了确保该方法在数据库级别是原子的,并且当出现故障时,整个事务将恢复,就好像它从未发生过一样。
通过中断事务,使用协程,如果您执行任何其他数据库操作,您会破坏方法的原子性,并且当出现故障时,协程的这些操作将不会恢复。
希望你在使用这种(反)模式时要小心!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。