spring事物的原始碼分析
阿新 • • 發佈:2020-08-10
主流程分析:
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就是使用的同一個。
這樣在提交、回滾的時候,這個連線下的操作就保證了原子性。
細節分析: