我对Spring的TranscationSynchronizationManager isActualTransactionActive()
和getCurrentTransactionName()
方法感到困惑。
给定非交易服务
@Service
public MyServiceImpl implements MyService {
public void someMethod() {
boolean isActive = TransactionSynchronizationManager.isActualTransactionActive();
String name = TransactionSynchronizationManager.getCurrentTransactionName();
}
}
在这里,我看到isActive
是false
,这是正确的,在调用getCurrentTransactionName()
的另一边我看到了事务名称(它打印de.mycompany.service.MyServiceImpl.someMethod
)。< / p>
因此,如果没有交易,为什么有当前的交易名称?不应该是null
?
答案 0 :(得分:4)
查看
的源代码
PlatformTransactionManager.getTransaction()
,其中称为
AbstractPlatformTransactionManager.prepareTransactionStatus()
,其中称为
AbstractPlatformTransactionManager.prepareSynchronization()
似乎当前交易定义的名称传递给TransactionSynchronizationManager.setCurrentTransactionName()
,无论是否存在实际交易。
因此,如果实际交易没有开始(例如传播NEVER
或SUPPORTS
),您可能会发生混淆。该方法可能更好地理解为获取当前事务定义名称