简介
- Spring 事务处理模块是通过 AOP 功能 来实现声明式事务处理的,通过spring-tx.jar包内 TransactionProxyFactoryBean 类来使用 AOP 功能。
- SpringBoot 的 autoconfigure 模块配置了启用事务,主要配置了 PlatformTransactionManager、TransactionTemplate 和代理方式。
- ProxyTransactionManagementConfiguration 配置了 BeanFactoryTransactionAttributeSourceAdvisor,可作为分析源码的入口。
编程式使用
这是spring事务的最基本使用方式,声明式事务也是在这个基础上进行扩展。
TransactionManager transactionManager = new DataSourceTransactionManager();
TransactionDefiniton td = new DefaultTransactionDefinition();
// transactionManager 是某一个具体的 PlatformTransactionManager实现类 的对象
TransactionStatus ts = transactionManager.getTransaction(td);
try {
// 这里是需要进行事务处理的方法调用
} catch (Exception e) {
transactionManager.rollback(ts);
throw e;
}
transactionManager.commit(ts);
TransactionManager
PlatformTransactionManager 是其中一个事务抽象,包括 DataSourceTransactionManager 等各种事务的实现,是执行事务的基本单元,并通过 TransactionSynchronizationManager 保存事务的状态。
TransactionTemplate
对外提供的api封装,具体实现还是调用TransactionManager,可配置隔离级别和传播方式,核心方法是execute方法。
TransactionSynchronizationManager
存储 TransactionManager 操作过程中的事务状态和用于扩展的 TransactionSynchronization 集合,都是静态方法,随便用。
TransactionSynchronization
TransactionSynchronizationAdapter 实现了此接口,用于扩展事务生命周期的各个操作,可以通过 TransactionSynchronizationManager 的 registerSynchronization 方法添加多个同步器。
注解式使用
@TransactionalEventListener
事务事件处理器 ,简化扩展
ApplicationListenerMethodTransactionalAdapter
用于监听事务内发送(如:eventPublisher.publishEvent(new StandardMessageEvent(joinPoint)))的事件,如果事件在事务内,动态创建监听器(根据 @TransactionalEventListener 配置,创建通过 TransactionSynchronization 的生命周期处理事件的监听器),否则原样将事件传递下去。
@Transactional
事务的切点,指定拦截的方法,AnnotationTransactionAttributeSource 是注解对应的解析类。
事务传播
事务传播是Spring提供的,通过 AbstractPlatformTransactionManager 的 getTransaction 实现,配置的值(隔离级别和传播方式)通过 TransactionTemplate 传递进去。