整體機(jī)制
兩階段提交協(xié)議的演變:
一階段:業(yè)務(wù)數(shù)據(jù)和回滾日志記錄在同一個(gè)本地事務(wù)中提交,釋放本地鎖和連接資源。
二階段:提交異步化,非??焖俚赝瓿??;貪L通過一階段的回滾日志進(jìn)行反向補(bǔ)償。
AT模式
一階段:
1.tm開啟一個(gè)全局事務(wù),seata服務(wù)器返回xid
2.執(zhí)行第一個(gè)本地事務(wù)(2.1前置鏡像 2.2執(zhí)行sql 2.3后置鏡像),注冊(cè)分支事務(wù)
3.feign調(diào)用第二個(gè)本地事務(wù)(3.1前置鏡像 3.2執(zhí)行sql 3.3后置鏡像),注冊(cè)分支事務(wù)
二階段:
1.沒有異常的情況,tm全局提交到tc,tc刪除全局事務(wù)、分支事務(wù)
2.有異常的情況下,tm全局提交到tc,tc刪除全局事務(wù)、分支事務(wù),通知各個(gè)rm進(jìn)行回滾操作
代碼層面:
1.@SeataAutoConfiguration 和@GlobalTransitionAutoConfiguration
會(huì)注冊(cè)一個(gè)BeanPostProcessor,名字是:GlobalTransactionScanner。
2.GlobalTransactionScanner.afterProperties()會(huì)初始化rm,tm,異步開啟注冊(cè)請(qǐng)求、重試請(qǐng)求、接受數(shù)據(jù)的線程池
3.GlobalTransactionScanner.wrapIfxxx()方法在生成動(dòng)態(tài)代理對(duì)象的的時(shí)候會(huì)增加一個(gè)GlobalTransactionInterceptor.
這個(gè)類內(nèi)部調(diào)用一個(gè)TransactionTemplate的模板類,模板類提供創(chuàng)建全局事務(wù)、創(chuàng)建分支事務(wù)、執(zhí)行業(yè)務(wù)邏輯處理、提交、回滾
前置鏡像和后置鏡像還有注冊(cè)分支事務(wù)都是通過代理datasource得到一個(gè)datasourceProxy里面處理的。