【问题标题】:Is it possible to use @Transactional and kotlin coroutines in spring boot?是否可以在 Spring Boot 中使用 @Transactional 和 kotlin 协程?
【发布时间】:2021-01-16 01:41:37
【问题描述】:

我有一个Spring boot项目,尝试使用@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
    // ...
}

【问题讨论】:

    标签: spring spring-boot kotlin kotlin-coroutines


    【解决方案1】:

    @Transactional 方法调用期间,您不能启动在不同线程上执行事务性工作的协程。

    @Transactional 导致代码被拦截。在deactivate()前后,会为你调用事务相关的代码。 因为协程可以在不同的线程上启动,它们将在这些事务调用之外启动。

    相关 StackOverflow 主题:Spring - @Transactional - What happens in background?

    【讨论】:

    • 非常感谢。如果我需要使用事务和协程,是否有一些解决方法?
    • 您可以调用协程并等待它,直到它在该函数中完成。
    【解决方案2】:

    将方法包装在事务中的原因是为了确保该方法在数据库级别是原子的,并且当出现故障时,整个事务将被还原,就好像它从未发生过一样。

    通过使用协程中断事务,如果您执行任何其他数据库操作,就会破坏方法的原子性,并且当出现故障时,协程的这些操作将不会被恢复。

    希望大家在使用这个(反)模式时要小心!

    【讨论】:

      猜你喜欢
      • 2021-01-26
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 2020-02-21
      • 1970-01-01
      • 2015-06-29
      • 2020-05-15
      • 2022-11-23
      相关资源
      最近更新 更多