Tcc-transaction dubbo 分布式事務(wù)

需求: Dubbo 如何做分布式事務(wù)?? 除了fescar 那么高深的框架,今天來學(xué)習(xí)一下 tcc-transaction, github 上的star 有3000多個(gè)(https://github.com/changmingxie/tcc-transaction.git)免姿。

介紹:

(1). tcc 指的是 try, cancel, confirm牵祟, 在 tcc-transaction 的源碼中薯蝎, cancel 和confirm 沒有做冪等性控制啃擦,?需要程序員手動(dòng)的保證他們的冪等性业舍。?

(2). tcc-transaction 主要是通過補(bǔ)償性的措施來保證分布式事務(wù)的。通過注解Compensable雀鹃, 指定confirmMethod 和?cancelMethod 的名字。

(3). tcc-transaction 對dubbo 的支持励两,是通過重新 擴(kuò)展 proxyFactory 的 spi黎茎,實(shí)現(xiàn)了Tccjavassist 和 tccjdk 方式來重新生成帶有?Compensable 注解的 代理類。 原聲的dubbo proxyFactory 是不能夠生成帶有?Compensable 注解的 代理類的当悔。

(4).tcc-transaction 主要是通過spring 的 AOP 中 通知環(huán)繞的方式傅瞻,來處理?Compensable 注解。

(5) 源代碼中?CompensableTransactionAspect (先執(zhí)行)和?ResourceCoordinatorInterceptor (后執(zhí)行) 是兩個(gè) 切面盲憎,執(zhí)行的順序依靠 spring core 中的 order 的大小嗅骄, 越小 執(zhí)行的順序越是提前,CompensableTransactionAspect 的執(zhí)行 order 是?Ordered.HIGHEST_PRECEDENCE饼疙。

(6) 通過AOP的環(huán)繞通知溺森,我們知道 類 中CompensableTransactionInterceptor 調(diào)用?pjp.proceed() 不會執(zhí)行 目標(biāo) method, 反而會執(zhí)行?ResourceCoordinatorInterceptor 中的?interceptTransactionContextMethod方法,ResourceCoordinatorInterceptor 中的?pjp.proceed(pjp.getArgs())方法屏积,才會調(diào)用執(zhí)行目標(biāo)方法澡罚。

好了, 首先得弄清楚tcc-transaction 給我們提供的案例肾请,大家先倒入sql留搔,比較全的那個(gè)sql 文檔,含有is_deleted 字段铛铁,然后用tomcat 啟動(dòng)是完全可以執(zhí)行的隔显,同時(shí)我嘗試的springboot start dubbo 版本也會放到github 上的,大家可以嘗試用我的案例 結(jié)合springboot dubbo 應(yīng)用去更好的解決分布式事務(wù)問題饵逐。

(7)個(gè)人覺得 tcc-transaction 沒有很好實(shí)現(xiàn)分布式事務(wù)括眠,源代碼簡單,雖然經(jīng)過大量的本地測試倍权,源碼里面有些情況不知道干什么用掷豺,比如?PROVIDER 類型 和?CONSUMER 類型的methodType, 因此個(gè)人僅僅當(dāng)作了解薄声, 不可生產(chǎn)環(huán)境使用当船,但是dubbo proxy 的封裝可以學(xué)習(xí)下,待以后封裝時(shí)候使用默辨。

(8)個(gè)人覺得?fescar 的模型層次更分明德频,Transaction coordinator ,維護(hù) 全局和分支的事務(wù)缩幸,驅(qū)動(dòng)全局事務(wù)的commit 或者 callback 壹置。Transaction Manager, 決定何時(shí)開始全局事務(wù),commit 或者 callback 全局事務(wù)表谊。Resource Manager, 管理分支上的事務(wù)钞护,并將分支事務(wù)執(zhí)行狀態(tài)報(bào)告給?Transaction coordinator?

好了,咱們?nèi)タ纯磘cc-transaction 的源碼邏輯?

CompensableTransactionAspect:

首先會加載tcc-transation-srping 里面?tcc-transaction.xml爆办, 加載好相關(guān)的bean 之后难咕,會調(diào)用到CompensableTransactionAspect 的interceptCompensableMethod方法,當(dāng)我們進(jìn)入方法之后押逼,發(fā)現(xiàn)下面的

TransactionContext transactionContext = FactoryBuilder.factoryOf(compensable.transactionContextEditor()).getInstance().get(pjp.getTarget(), method, pjp.getArgs());

dubbo 的transactionContext 是由 dubbo 的 RpcContext來設(shè)置步藕,dubbo RpcContext 是由 threadlocal 原理來實(shí)現(xiàn)的。然后再判斷是不是合法的t rantransactionConext. 計(jì)算methodType 的邏輯有點(diǎn)不太明白作者的思路挑格,因?yàn)闆]有注釋咙冗,其中經(jīng)過測試 method type 是root 的表明是 一個(gè)事務(wù)的根事務(wù),會開啟一個(gè)全局的事務(wù)漂彤,?PROVIDER 字面上的意思是服務(wù)的提供方雾消,之前全局的事務(wù)已經(jīng)開啟了灾搏。然后再去判斷 try, confirm 和 cancel 狀態(tài)立润。

MethodType methodType =CompensableMethodUtils.calculateMethodType(propagation, isTransactionActive, transactionContext);

然后執(zhí)行?returnValue = pjp.proceed();??

ResourceCoordinatorInterceptor狂窑,

?我們看?interceptTransactionContextMethod方法,首先是獲取 CompensableTransactionAspect 創(chuàng)建的事務(wù)桑腮, 如果事務(wù)是trying 的狀態(tài)泉哈,就會通過?enlistParticipant 方法,將要執(zhí)行的?Participant 加入到?transactionManager 中破讨, 以待后面執(zhí)行丛晦。 return pjp.proceed(pjp.getArgs()); 才會執(zhí)行真正的方法體,任務(wù)的異常報(bào)錯(cuò)提陶,都會執(zhí)行?CompensableTransactionInterceptor 的?rootMethodProceed烫沙,?transactionManager.rollback(asyncCancel); 將會執(zhí)行cancel 方法。 此時(shí)cancel 方法必須是冪等的而且必須能夠回滾之前的操作隙笆,這種會對程序員要求很高锌蓄。?

如果沒有異常發(fā)生,就會執(zhí)行?transactionManager.commit(asyncConfirm);撑柔,將事務(wù)commit 提交瘸爽,執(zhí)行confirm 方法,try 方法是方法體乏冀,預(yù)留資源蝶糯, confirm 將預(yù)留資源 進(jìn)行確認(rèn)操作, cancel 就是將預(yù)留資源回滾辆沦。

DefaultRecoverConfig

這個(gè)方法沒有看,但是拍腦袋想應(yīng)該是當(dāng)事務(wù)執(zhí)行失敗時(shí)候识虚,進(jìn)行不斷的嘗試肢扯,因?yàn)槲矣X得生產(chǎn)線上不會使用這個(gè)來做嘗試機(jī)制,還需自己設(shè)計(jì)

總體感覺沒有注釋担锤, 沒有文檔蔚晨,此外邏輯比較簡單,我覺得不適合做dubbo 的分布式事務(wù)肛循。

測試代碼見下面的github:?https://github.com/dongdongqin/tcc-transaction-demo.git? ??

consumer 那端自己照樣子寫就好铭腕,很簡單。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末多糠,一起剝皮案震驚了整個(gè)濱河市累舷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夹孔,老刑警劉巖被盈,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件析孽,死亡現(xiàn)場離奇詭異,居然都是意外死亡只怎,警方通過查閱死者的電腦和手機(jī)袜瞬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來身堡,“玉大人邓尤,你說我怎么就攤上這事√眩” “怎么了裁赠?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赴精。 經(jīng)常有香客問我佩捞,道長,這世上最難降的妖魔是什么蕾哟? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任一忱,我火速辦了婚禮,結(jié)果婚禮上谭确,老公的妹妹穿的比我還像新娘帘营。我一直安慰自己,他們只是感情好逐哈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布芬迄。 她就那樣靜靜地躺著,像睡著了一般昂秃。 火紅的嫁衣襯著肌膚如雪禀梳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天肠骆,我揣著相機(jī)與錄音算途,去河邊找鬼。 笑死蚀腿,一個(gè)胖子當(dāng)著我的面吹牛嘴瓤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播莉钙,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼廓脆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了磁玉?” 一聲冷哼從身側(cè)響起停忿,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜀涨,沒想到半個(gè)月后瞎嬉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝎毡,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年氧枣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沐兵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡便监,死狀恐怖扎谎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情烧董,我是刑警寧澤毁靶,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站逊移,受9級特大地震影響预吆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胳泉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一拐叉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扇商,春花似錦凤瘦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至控汉,卻和暖如春笔诵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背暇番。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工嗤放, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人壁酬。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像恨课,于是被迫代替她去往敵國和親舆乔。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容