Spring事务TransactionSynchronizationManager:isActualTransactionActive vs isSynchronizationActive

时间:2013-09-12 18:01:44

标签: spring transactions synchronization

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

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

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

1 个答案:

答案 0 :(得分:4)

您会注意到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陈述

  

如果事务同步未激活,则表示没有   当前交易,或交易经理不支持   事务同步。

因此,您首先使用TransactionSynchronizationinitSynchronization()初始化并注册registerSynchronization(TransactionSynchronization)。注册后,TransactionManager可以Transaction开始TransactionSynchronizationManager告诉setActualTransactionActive(boolean) isSynchronizationActive()是否有效。

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

Transaction告诉我们实际的TransactionSynchronizationManager对象是否有效。

{{1}} javadoc状态

  

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

所以不要忽视它。