【问题标题】:How can I determine whether I am in a transaction in Spring?如何确定我是否在 Spring 中进行事务处理?
【发布时间】:2018-01-19 15:51:16
【问题描述】:

我在 Spring 服务中存在持久性问题。一个 Rest-Controller R 接收一个请求,并通过一些代码层通过复杂的方式调用一个服务 S。 S中的service方法声明了一个事务;这应该是第一次开始交易。 但是该服务的行为就像之前已经启动的事务一样,并且我的一些数据对象将成为会话的一部分(它们一定不能)。 如何确定交易是否已处于活动状态?我试图注入 EntityManager 和/或 JpaTransactionManager;但两者似乎都无济于事。

如何查看我是否在交易中?

在我通过所有这些层寻找可能的嫌疑人之前,我想确定这一点。

【问题讨论】:

  • 没有直接回答您的问题,但听起来您像我们一样成为 Open Session In View (OSIV) 的受害者。默认情况下启用(出于历史原因)。查看another thread in StackOverflow了解更多详情。

标签: java spring transactions spring-data-jpa


【解决方案1】:

您可以使用TransactionSynchronizationManager.isActualTransactionActive() 检查交易是否处于活动状态。但是你应该在服务方法执行之前调用它。

您还可以使用

获取当前交易的状态
TransactionStatus status = TransactionAspectSupport.currentTransactionStatus();

此外,启用事务日志记录可能对您来说是一个不错的选择。

log4j.logger.org.hibernate.transaction=DEBUG
log4j.logger.org.springframework.transaction=DEBUG

【讨论】:

  • 如果我得到 TransactionSynchronizationManager.isActualTransactionActive() = true,但 TransactionAspectSupport.currentTransactionStatus() 抛出:范围内没有事务方面管理的 TransactionStatus 怎么办?
【解决方案2】:

你可以使用

org.springframework.transaction.support.TransactionSynchronizationManager#isActualTransactionActive

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多