我发现!TransactionSynchronization

TransactionSynchronizationManager事务同步管理器

TransactionSynchronizationManager理解

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

TransactionSynchronizationManager源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
java复制代码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方法初始化事务同步器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
java复制代码/**
* 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方法

1
2
3
4
5
6
java复制代码TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
//自定义业务操作
}
});

哪里触发afterCommitafterCompletion呢?

AbstractPlatformTransactionManagerprocessCommit方法中进行回调所有TransactionSynchronization

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
java复制代码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);
}
}

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%