1. 程式人生 > 實用技巧 >spring事物的原始碼分析

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

這樣在提交、回滾的時候,這個連線下的操作就保證了原子性。

細節分析: