getCurrentTransactionName

getCurrentTransactionName

我对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)。

那么,如果没有事务,为什么会有当前的事务名称?不应该是null吗?

最佳答案

看一下源代码
PlatformTransactionManager.getTransaction(),它调用
AbstractPlatformTransactionManager.prepareTransactionStatus(),它调用
AbstractPlatformTransactionManager.prepareSynchronization()

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

因此,在未开始实际交易的情况下(例如,传播NEVERSUPPORTS),您可能会遇到混淆。最好将方法理解为获取当前事务定义名称

10-07 16:48