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 { |
本文转载自: 掘金