有没有比使用TransactionSynchronizationManager.isActualTransactionActive()更好的方法来检测Spring数据库事务是否处于活动状态?

时间:2011-08-16 18:24:38

标签: spring transactions

我有一些遗留代码,我现在正试图在Spring下重用。这段代码深深地嵌套在其他代码中,因此重新设计并不常用,在许多情况下都会调用,其中只有一些是通过Spring实现的。我想做的是使用Spring事务,如果已经启动了;否则,继续使用现有(传统)数据库连接机制。我们的第一个想法是让我们的遗留类成为bean并使用注入的TransactionPlatformManager,但这似乎没有任何方法与我们的情况密切相关。一些研究表明Spring有一个名为TransactionSynchronizationManager的类,它有一个静态方法isActualTransactionActive()。我的测试表明,这种方法是检测Spring事务是否处于活动状态的可靠方法:

  • 在没有@Transactional注释的情况下通过Spring服务调用时,它返回false
  • 当使用@Transactional通过Spring服务调用时,它返回true
  • 在我称为现有方式的遗留方法中,它返回false

我的问题:有没有更好的方法来检测交易是否有效?

1 个答案:

答案 0 :(得分:47)

没有比TransactionSynchronizationManager.isActualTransactionActive()更好的方法了。它是spring用来处理事务的实用方法。虽然不建议在您的代码中使用它,但对于某些特定情况,您应该 - 这就是为什么它是公开的。

另一种方法可能是使用实体管理器/会话/连接并检查是否存在现有事务,但我更喜欢同步管理器。