1.@EnableTransactionManagement原理
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(TransactionManagementConfigurationSelector.class)
public @interface EnableTransactionManagement {
}
可以看出@EnableTransactionManagement利用TransactionManagementConfigurationSelector给容器中会导入组件.
会导入两个组件AutoProxyRegistrar和ProxyTransactionManagementConfiguration
-
AutoProxyRegistrar
会给容器中注册一个InfrastructureAdvisorAutoProxyCreator组件
利用后置处理器机制在对象创建以后,包装对象, 返回一个代理对象(增强器),代理对象执行方法利用拦截器进行调用.,过程在上篇AOP中有详细介绍 -
ProxyTransactionManagementConfiguration
是个配置类@Configuration public class ProxyTransactionManagementConfiguration extends AbstractTransactionManagementConfiguration { //1.给容器注册一个事物增强器 @Bean(name = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME) @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor() { BeanFactoryTransactionAttributeSourceAdvisor advisor = new BeanFactoryTransactionAttributeSourceAdvisor(); //1.1 首先注册了AnnotationTransactionAttributeSource,解析事物注解的信息1. advisor.setTransactionAttributeSource(transactionAttributeSource()); //1.2设置事务拦截器 advisor.setAdvice(transactionInterceptor()); if (this.enableTx != null) { advisor.setOrder(this.enableTx.<Integer>getNumber("order")); } return advisor; } //解析事物注解的信息 @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public TransactionAttributeSource transactionAttributeSource() { return new AnnotationTransactionAttributeSource(); } //设置事务拦截器 @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public TransactionInterceptor transactionInterceptor() { TransactionInterceptor interceptor = new TransactionInterceptor(); interceptor.setTransactionAttributeSource(transactionAttributeSource()); if (this.txManager != null) { interceptor.setTransactionManager(this.txManager); } return interceptor; } }
-
给容器中注册事务增强器
-
事务增强器要用事务注解的信息,
AnnotationTransactionAttributeSource解析事物注解的信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hNAcfS1d-1575821134910)(/Users/laiyanxin/Library/Application Support/typora-user-images/image-20191208233609659.png)] -
事务拦截器
TransactionInterceptor保存了事务属性信息,事务管理器他是一个MethodInterceptor,在目标执行的时候,会包装成拦截器链,执行拦截器链
这个拦截器链只有一个TransactionInterceptor事务拦截器
-
先获取事务相关属性
-
再获取PlatformTransactionManager,如果事先没有添加执行任务TransactionManager,最终会从容器中按照类型获取一个PlatformTransactionManager
-
执行目标方法,如果异常获取到事务管理器,利用事务管理器回滚
txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus());
如果征程获取到事务管理器,利用事务管理器提交事务
txInfo.getTransactionManager().commit(txInfo.getTransactionStatus());
-
-
//执行目标方法时候核心代码 invokeWithinTransaction protected Object invokeWithinTransaction(Method method, @Nullable Class<?> targetClass, final InvocationCallback invocation) throws Throwable { TransactionAttributeSource tas = getTransactionAttributeSource(); final TransactionAttribute txAttr = (tas != null ? tas.getTransactionAttribute(method, targetClass) : null); //获取到事务管理器 final PlatformTransactionManager tm = determineTransactionManager(txAttr); //获取到执行的方法 final String joinpointIdentification = methodIdentification(method, targetClass, txAttr); if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) { // 如果是必要的就开启事务,通过事物管理器 TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification); Object retVal = null; try { //执行事务方法 retVal = invocation.proceedWithInvocation(); } catch (Throwable ex) { // 执行遇到异常,利用事务管理器回滚 completeTransactionAfterThrowing(txInfo, ex); throw ex; } finally { cleanupTransactionInfo(txInfo); } //如果正常,利用事务管理器提交事务 commitTransactionAfterReturning(txInfo); //里面逻辑txInfo.getTransactionManager().commit(txInfo.getTransactionStatus()); return retVal; } }
-
2.总结
- 首先通过AutoProxyRegistrar注册了InfrastructureAdvisorAutoProxyCreator,后置处理器,利用后置处理机制帮我们包装了一个代理对象
- 在通过注册ProxyTransactionManagementConfiguration配置,为我们注册了一个事物增强器.事物增强器包含了事物拦截器,事务信息等等,
- 代理对象执行目标方法,会被拦截器拦截,通过事务 管理器来开启事务,遇到异常,利用事务管理回滚事务,如果正常,利用事务管理器提交事务