关于事务的具体概念和使用方式,Spring事务管理有详细介绍
基于注解的事务管理
|
|
Spring事务调用过程
Spring事务使用AOP代理后的方法调用执行流程,如图所示:
从图中可以看出,调用事务时首先调用的是AOP代理对象而不是目标对象,首先执行事务切面,事务切面内部通过TransactionInterceptor环绕增强进行事务的增强。即进入目标方法之前开启事务,退出目标方法时提交/回滚事务。
源码分析
假设配置两个以上的<tx:annotation-driven/>标签:
|
|
结果只有第一个<tx:annotation-driven/>会生效,也就是使用@Transactional注解时不指定事务管理器,默认使用的事务管理器是transactionManager1。如果要使用多个事务管理器,需要在使用@Transactional时指定具体的TransactionManager
<tx:annotation-driven/>分析
这个标签是由TxNamespaceHandler解析的,代码如下:
|
|
这里关注AnnotationDrivenBeanDefinitionParser解析器,代码如下:
|
|
AopAutoProxyConfigurer作为AnnotationDrivenBeanDefinitionParser静态内部类,关键代码如下:

重点代码被红框标记,最外层的if判断保证<tx:annotation-driven/>标签只能被解析一次,所以只有第一次被解析的标签会生效。分别注册了三个BeanDefinition,分别为AnnotationTransactionAttributeSource、TransactionInterceptor和BeanFactoryTransactionAttributeSourceAdvisor,并将前两个BeanDefinition添加到第三个BeanDefinition的属性当中,这三个bean支撑了整个事务功能
下面关注事务管理怎么注册的:
|
|
如果tx:annotation-driven没有指定transaction-manager,系统会默认注册transactionManager
|
|
实际注册的是InfrastructureAdvisorAutoProxyCreator动态代理生成器
前面文章介绍使用Spring Aop做切面增强,使用的是AspectJAwareAdvisorAutoProxyCreator,可见普通aop代理生成器和InfrastructureAdvisorAutoProxyCreator都是继承于AbstractAdvisorAutoProxyCreator,具体的代理生成过程参考“Spring AOP源码分析”

