TransactionSynchronizationManager事务同步管理器
TransactionSynchronizationManager理解
TransactionSynchronizationManager使用多个ThreadLocal维护每个线程事务独立的资源信息,配合AbstractPlatformTransactionManager以及其子类,
设置线程事务的配置属性和运行态,并可通过自定义实现TransactionSynchronization进行注册,监听事务的操作
举个业务场景:假设业务流程最后有个异步操作,业务流程依赖事务,且异步操作依赖业务流程在事务中新增或者更新的数据,
这会出现一个问题,异步操作在事务还没提交前执行了,查询的数据是未提交前的,导致异步操作无效
那么可以使用Spring的TransactionSynchronizationManager注册自定义的TransactionSynchronization,实现afterCommit方法(也有其他方法),
使得在事务的那个运行状态下,执行自定义的业务逻辑
TransactionSynchronizationManager源码
1 | java复制代码public abstract class TransactionSynchronizationManager { |
在org.springframework.transaction.interceptor.TransactionInterceptor#invoke中,对事务方法进行拦截处理。在createTransactionIfNecessary里执行getTransaction时,会调用AbstractPlatformTransactionManager#prepareSynchronization方法初始化事务同步器。
1 | java复制代码/** |
TransactionSynchronization扩展
一般常用是TransactionSynchronization的afterCommit和afterCompletion方法
1 | java复制代码TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { |
哪里触发afterCommit和afterCompletion呢?
在AbstractPlatformTransactionManager的processCommit方法中进行回调所有TransactionSynchronization
1 | java复制代码private void processCommit(DefaultTransactionStatus status) throws TransactionException { |
本文转载自: 掘金