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就是使用的同一个。

这样在提交、回滚的时候,这个连接下的操作就保证了原子性。

细节分析:

 
原文地址:https://www.cnblogs.com/chenjfblog/p/13471375.html