Spring事务处理事务同步管理器:isActualTransactionActive vs isSynchronizationActive
我对春季的事务资源管理有点困惑。也就是说,我对Spring事务处理事务同步管理器:isActualTransactionActive vs isSynchronizationActive,spring,transactions,synchronization,Spring,Transactions,Synchronization,我对春季的事务资源管理有点困惑。也就是说,我对TransactionSynchronizationManager.isActualTransactionActive和TransactionSynchronizationManager.isSynchronizationActive的用法感到困惑 到目前为止,我假设isSynchronizationActive被用于(也在Spring代码库中)判断是否存在由TransactionSynchronizationManager.initSynchron
TransactionSynchronizationManager.isActualTransactionActive
和TransactionSynchronizationManager.isSynchronizationActive
的用法感到困惑
到目前为止,我假设isSynchronizationActive
被用于(也在Spring代码库中)判断是否存在由TransactionSynchronizationManager.initSynchronization()启动的活动事务,这可能是错误的。就我而言,当我们暂停交易时,实际的isSynchronizationActive
仍然是真的!因此,我认为建立运行事务的正确方法是使用isActualTransactionActive
,对吗
如果是这种情况,那么isSynchronizationActive
方法的实际意义是什么?我知道它告诉您是否可以添加同步,但我对它告诉我们的有关事务的信息有点不知所措…您会注意到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");
TransactionSynchronizationManager
基本上充当TransactionSynchronization
的注册表。javadoc声明
如果事务同步未处于活动状态,则没有
当前事务,或事务管理器不支持
事务同步
因此,首先使用initSynchronization()
和registerSynchronization(TransactionSynchronization)
初始化并注册TransactionSynchronization
。注册后,TransactionManager
可以启动一个事务
,并告诉TransactionSynchronizationManager
它是否在setActualTransactionActive(布尔值)
中处于活动状态
总之,isSynchronizationActive()
告诉我们是否启用了TransactionSynchronization
,即使没有注册任何TransactionSynchronization
实例
isActualTransactionActive()
告诉我们是否有实际的事务
对象处于活动状态
TransactionSynchronizationManager
javadoc状态
管理资源和事务同步的中心帮助器
每个线程。供资源管理代码使用,但不供典型用户使用
申请代码。
所以不要忽略它。谢谢,我得到了上面的信息。我现在有一个问题:当尝试在不受支持的传播中执行嵌套事务时,全局事务将被挂起,但非事务方法的同步是活动的。此外,如果我从TransactionTemplate执行非事务性代码,那么事务模板实际上会在事务管理器上调用commit
,进而执行所有同步。这对我来说似乎有点奇怪,因为非事务性执行的东西应该是。。。非-transactional@Bober02你能举例说明你的@transactionall
不受支持的方法吗?我有个主意,但不确定。
public static boolean isSynchronizationActive() {
return (synchronizations.get() != null);
}
public static boolean isActualTransactionActive() {
return (actualTransactionActive.get() != null);
}