Spring transactions TransactionSynchronizationManager: isAct



我对 Spring 中的事务资源管理有点困惑。也就是说,我对TransactionSynchronizationManager.isActualTransactionActiveTransactionSynchronizationManager.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");

和方法

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

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

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

因此,您首先使用 initSynchronization()registerSynchronization(TransactionSynchronization) 初始化并注册TransactionSynchronization。注册这些后,TransactionManager可以启动Transaction并告诉TransactionSynchronizationManager它是否处于活动状态,setActualTransactionActive(boolean) .

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

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

javadoc 状态TransactionSynchronizationManager

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

所以不要忽视它。

最新更新