我对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
)。那么,如果没有事务,为什么会有当前的事务名称?不应该是
null
吗? 最佳答案
看一下源代码PlatformTransactionManager.getTransaction()
,它调用AbstractPlatformTransactionManager.prepareTransactionStatus()
,它调用AbstractPlatformTransactionManager.prepareSynchronization()
似乎无论是否存在实际交易,当前交易定义的名称都会传递给TransactionSynchronizationManager.setCurrentTransactionName()
。
因此,在未开始实际交易的情况下(例如,传播NEVER
或SUPPORTS
),您可能会遇到混淆。最好将方法理解为获取当前事务定义名称