我对Spring中的事务资源管理有点困惑。也就是说,我对TransactionSynchronizationManager.isActualTransactionActive
和TransactionSynchronizationManager.isSynchronizationActive
的使用感到困惑。
到目前为止,可能不正确,我假设使用了isSynchronizationActive
(也在Spring代码库中)来确定是否存在由TransactionSynchronizationManager.initSynchronization()
启动的活动事务。就我而言,当我们暂停交易时,实际的isSynchronizationActive
仍然是真的!因此,我认为建立正在运行的交易的正确方法是使用isActualTransactionActive
,正确吗?
如果是这种情况,isSynchronizationActive
方法的实际意义是什么?我理解它会告诉你是否可以添加同步,但我对它告诉我们有关交易的内容有点迷失......
答案 0 :(得分:4)
您会注意到TransactionSynchronizationManager
private static final ThreadLocal<Set<TransactionSynchronization>> synchronizations =
new NamedThreadLocal<Set<TransactionSynchronization>>("Transaction synchronizations");
private static final ThreadLocal<Boolean> actualTransactionActive =
new NamedThreadLocal<Boolean>("Actual transaction active");
和方法
public static boolean isSynchronizationActive() {
return (synchronizations.get() != null);
}
public static boolean isActualTransactionActive() {
return (actualTransactionActive.get() != null);
}
TransactionSynchronizationManager
基本上充当TransactionSynchronization
的注册表。 javadoc陈述
如果事务同步未激活,则表示没有 当前交易,或交易经理不支持 事务同步。
因此,您首先使用TransactionSynchronization
和initSynchronization()
初始化并注册registerSynchronization(TransactionSynchronization)
。注册后,TransactionManager
可以Transaction
开始TransactionSynchronizationManager
告诉setActualTransactionActive(boolean)
isSynchronizationActive()
是否有效。
总之,TransactionSynchronization
告诉我们是否已启用TransactionSynchronization
,即使没有注册isActualTransactionActive()
个实例。
Transaction
告诉我们实际的TransactionSynchronizationManager
对象是否有效。
{{1}} javadoc状态
管理资源和事务同步的中央帮助程序 每个帖子。由资源管理代码使用,但不是典型的 应用程序代码。
所以不要忽视它。