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

foo*_*sus 40 spring transactions

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

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

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

Boz*_*zho 48

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

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