9

我对 Spring 中的事务资源管理有点困惑。TransactionSynchronizationManager.isActualTransactionActive即,我对and的用法感到困惑TransactionSynchronizationManager.isSynchronizationActive

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

如果是这种情况,isSynchronizationActive方法的实际意义是什么?我知道它会告诉您是否可以添加同步,但是我对它告诉我们有关事务的内容有点迷茫...

4

1 回答 1

6

您会注意到以下字段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充当. TransactionSynchronizationjavadoc 状态

如果事务同步未激活,则要么没有当前事务,要么事务管理器不支持事务同步。

TransactionSynchronization因此,您首先使用initSynchronization()and进行初始化和注册registerSynchronization(TransactionSynchronization)。当这些被注册时,TransactionManager可以启动 aTransaction并用 来TransactionSynchronizationManager判断它是否处于活动状态setActualTransactionActive(boolean)

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

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

javadocTransactionSynchronizationManager状态

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

所以不要忽视它。

于 2013-09-12T19:03:45.557 回答