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);
}