spring事物的源码分析
主流程分析:
1、通过annotation-driven标签 进行 解析、注册。
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
init方法中,通过AnnotationDrivenBeanDefinitionParser 对标签进行解析,将其中用来对bean进行包装的beanPostProcessor的advisor 注册到BeanDefinitionRegistry中去。
org.springframework.transaction.config.TxNamespaceHandler.init();
@Override
public void init() {
registerBeanDefinitionParser("advice", new TxAdviceBeanDefinitionParser());
registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());
registerBeanDefinitionParser("jta-transaction-manager", new JtaTransactionManagerBeanDefinitionParser());
}
2、在bean初始化的的阶段,解析符合该bean上的事物注解的advisor,通过cglib构造代理bean, 将相应的TransactionIntecepter 设置到这个代理bean中。
3、在bean的实际调用阶段,通过代理bean来使用。使用的时候,通过TransactionIntecepter ,进行try catch finally 的 提交、回滚操作。
其中事物实现的技巧,
1、进入事物拦截器,则将connection设置为非自动提交,在整个事物完成后,再重置connection的提交为自动提交。
2、在调用方法的时候,通过线程变量,将当前connection加入进去,后续其他方法获取的connection,也从这个线程变量中去取。这样同一个事物中的connection就是使用的同一个。
这样在提交、回滚的时候,这个连接下的操作就保证了原子性。
细节分析: