Spring TransactionSynchronizationManager isActualTransactionActive()和getCurrentTransactionName()混淆

时间:2015-09-11 13:10:05

标签: java spring transactions spring-data

我对Spring的TranscationSynchronizationManager isActualTransactionActive()getCurrentTransactionName()方法感到困惑。

给定非交易服务

@Service
public MyServiceImpl implements MyService {
   public void someMethod() {
     boolean isActive = TransactionSynchronizationManager.isActualTransactionActive();
     String name = TransactionSynchronizationManager.getCurrentTransactionName();
   }

}

在这里,我看到isActivefalse,这是正确的,在调用getCurrentTransactionName()的另一边我看到了事务名称(它打印de.mycompany.service.MyServiceImpl.someMethod)。< / p>

因此,如果没有交易,为什么有当前的交易名称?不应该是null

1 个答案:

答案 0 :(得分:4)

查看
的源代码 PlatformTransactionManager.getTransaction(),其中称为 AbstractPlatformTransactionManager.prepareTransactionStatus(),其中称为 AbstractPlatformTransactionManager.prepareSynchronization()

似乎当前交易定义的名称传递给TransactionSynchronizationManager.setCurrentTransactionName(),无论是否存在实际交易

因此,如果实际交易没有开始(例如传播NEVERSUPPORTS),您可能会发生混淆。该方法可能更好地理解为获取当前事务定义名称