likes
comments
collection
share

我发现!TransactionSynchronizationManager很强

作者站长头像
站长
· 阅读数 18

TransactionSynchronizationManager事务同步管理器

TransactionSynchronizationManager理解

TransactionSynchronizationManager使用多个ThreadLocal维护每个线程事务独立的资源信息,配合AbstractPlatformTransactionManager以及其子类, 设置线程事务的配置属性和运行态,并可通过自定义实现TransactionSynchronization进行注册,监听事务的操作 举个业务场景:假设业务流程最后有个异步操作,业务流程依赖事务,且异步操作依赖业务流程在事务中新增或者更新的数据, 这会出现一个问题,异步操作在事务还没提交前执行了,查询的数据是未提交前的,导致异步操作无效 那么可以使用SpringTransactionSynchronizationManager注册自定义的TransactionSynchronization,实现afterCommit方法(也有其他方法), 使得在事务的那个运行状态下,执行自定义的业务逻辑

TransactionSynchronizationManager源码

public abstract class TransactionSynchronizationManager {
    //线程上下文中保存着【线程池对象:ConnectionHolder】的Map对象。线程可以通过该属性获取到同一个Connection对象。
	private static final ThreadLocal<Map<Object, Object>> resources = new NamedThreadLocal<>("Transactional resources");
    //事务同步器,事务运行时的扩展代码,每个线程可以注册N个事务同步器。
	private static final ThreadLocal<Set<TransactionSynchronization>> synchronizations = new NamedThreadLocal<>("Transaction synchronizations");
    //事务名称
	private static final ThreadLocal<String> currentTransactionName = new NamedThreadLocal<>("Current transaction name");
    //事务是否只读
	private static final ThreadLocal<Boolean> currentTransactionReadOnly = new NamedThreadLocal<>("Current transaction read-only status");
    //事务隔离级别
	private static final ThreadLocal<Integer> currentTransactionIsolationLevel = new NamedThreadLocal<>("Current transaction isolation level");
    //事务是否开启
	private static final ThreadLocal<Boolean> actualTransactionActive = new NamedThreadLocal<>("Actual transaction active");

}

org.springframework.transaction.interceptor.TransactionInterceptor#invoke中,对事务方法进行拦截处理。在createTransactionIfNecessary里执行getTransaction时,会调用AbstractPlatformTransactionManager#prepareSynchronization方法初始化事务同步器。

/**
 * Initialize transaction synchronization as appropriate.
 */
protected void prepareSynchronization(DefaultTransactionStatus status, TransactionDefinition definition) {
	if (status.isNewSynchronization()) {
		TransactionSynchronizationManager.setActualTransactionActive(status.hasTransaction());
		TransactionSynchronizationManager.setCurrentTransactionIsolationLevel(
				definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT ?
						definition.getIsolationLevel() : null);
		TransactionSynchronizationManager.setCurrentTransactionReadOnly(definition.isReadOnly());
		TransactionSynchronizationManager.setCurrentTransactionName(definition.getName());
		TransactionSynchronizationManager.initSynchronization();
	}
}   

TransactionSynchronization扩展

一般常用是TransactionSynchronization的afterCommit和afterCompletion方法

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
    @Override
    public void afterCommit() {
        //自定义业务操作
    }
});

哪里触发afterCommitafterCompletion呢?

AbstractPlatformTransactionManagerprocessCommit方法中进行回调所有TransactionSynchronization

private void processCommit(DefaultTransactionStatus status) throws TransactionException {
    try {
        //提交事务
        doCommit(status);
        ...
        try {
           //回调所有事务同步器的afterCommit方法。
           triggerAfterCommit(status);
        }
        finally {
           //回调所有事务同步器的afterCompletion方法。
           triggerAfterCompletion(status, TransactionSynchronization.STATUS_COMMITTED);
        }

    }
    finally {
        //清除TransactionSynchronizationManager的ThreadLocal绑定的数据。
        //解除Thread绑定的resources资源。
        //将Commit设置为自动提交。
        //清理ConnectionHolder资源。
        cleanupAfterCompletion(status);
    }
}