Spring事务TransactionSynchronizationManager:isActualTransactionActive vs isSynchronizationActive

Bob*_*r02 7 spring synchronization transactions

我对Spring中的事务资源管理有点困惑.也就是说,我对TransactionSynchronizationManager.isActualTransactionActive和的使用感到困惑TransactionSynchronizationManager.isSynchronizationActive.

到目前为止,可能是错误的,我假设isSynchronizationActive已经使用(也在Spring代码库中)来确定是否存在由其发起的活动事务TransactionSynchronizationManager.initSynchronization().就我而言,当我们暂停交易时,实际isSynchronizationActive仍然是真的!因此,我认为建立正在运行的交易的正确方法是使用isActualTransactionActive,正确吗?

如果是这种情况,isSynchronizationActive方法的实际意义是什么?我理解它会告诉你是否可以添加同步,但我对它告诉我们有关交易的内容有点迷失...

Sot*_*lis 5

您会注意到以下字段 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");
Run Code Online (Sandbox Code Playgroud)

和方法

public static boolean isSynchronizationActive() {
    return (synchronizations.get() != null);
}

public static boolean isActualTransactionActive() {
    return (actualTransactionActive.get() != null);
}
Run Code Online (Sandbox Code Playgroud)

TransactionSynchronizationManager基本上充当注册表TransactionSynchronization。Javadoc状态

如果事务同步未处于活动状态,则说明当前没有事务,或者事务管理器不支持事务同步。

所以,你首先初始化并注册TransactionSynchronizationinitSynchronization()registerSynchronization(TransactionSynchronization)。当这些被注册后,TransactionManager可以使用来启动,Transaction并使用来告知其TransactionSynchronizationManager是否处于活动状态setActualTransactionActive(boolean)

总之, 即使没有实例注册,也isSynchronizationActive()告诉我们是否TransactionSynchronization已启用TransactionSynchronization

isActualTransactionActive()告诉我们是否有实际的Transaction活动对象。

TransactionSynchronizationManagerjavadoc的状态

中央助手,用于管理每个线程的资源和事务同步。由资源管理代码而非典型的应用程序代码使用。

所以不要忽略它。