关于事务的具体概念和使用方式,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源码分析”