W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
Mycat2事務(wù)基于Vertx的異步SQL接口構(gòu)建,但是其實(shí)現(xiàn)是自研的mysql協(xié)議實(shí)現(xiàn)
Mycat2在只涉及一個(gè)數(shù)據(jù)庫的事務(wù)不會(huì)開啟XA事務(wù),在涉及多個(gè)數(shù)據(jù)庫的事務(wù)才會(huì)開啟XA事務(wù)。
對(duì)于非MySQL
數(shù)據(jù)源,Mycat2不會(huì)在啟動(dòng)的時(shí)候執(zhí)行XA RECOVER
.不能使用XA事務(wù),請(qǐng)?jiān)谂渲弥邪咽聞?wù)設(shè)置為proxy
類型
暫時(shí) Mycat2 缺 XA 死鎖檢查,實(shí)現(xiàn)該功能需要改動(dòng)MySQL的源碼,所以業(yè)務(wù)代碼添加全局鎖或者梳理事務(wù)代碼來避免XA死鎖。
在Mycat沒有出現(xiàn)異常關(guān)閉的情況下,在設(shè)計(jì)上,正常使用是不需要人工XA事務(wù)恢復(fù)的,僅僅在Mycat出現(xiàn)異常關(guān)閉,而且Mycat再次啟動(dòng)的時(shí)候無法恢復(fù)XA事務(wù)的情況下才需要人工參與恢復(fù).
1.15
開始支持MySQL XA事務(wù),事務(wù)日志表會(huì)在Mycat2啟動(dòng)時(shí)候在存儲(chǔ)節(jié)點(diǎn)上建立mycat.xa_log
表.
它記錄已經(jīng)進(jìn)入commit
節(jié)點(diǎn)事務(wù),在此表有記錄的分布式事務(wù)都是要提交的,而不在此表的XA PREPARE
階段事務(wù)是要回滾的.mycat.xa_log
表的記錄是事務(wù)已經(jīng)進(jìn)入commit
階段但是沒有執(zhí)行完成的依據(jù).
如果訪問某存儲(chǔ)節(jié)點(diǎn)的sql阻塞,有可能是XA PREPARE
階段的事務(wù)沒有被COMMIT
或者ROLLBACK
.Mycat在啟動(dòng)的時(shí)候會(huì)根據(jù)XA RECOVER
語句,可以得到mysql上存在的PREPARE
階段事務(wù),然后檢查每個(gè)存儲(chǔ)節(jié)點(diǎn)數(shù)據(jù)庫的mycat.xa_log
如果有該對(duì)應(yīng)的xid
,則會(huì)自動(dòng)執(zhí)行XA COMMIT 'xxxx'
補(bǔ)上commit
,如果沒有,則補(bǔ)上XA ROLLBACK 'xxx'
回滾.這兩個(gè)操作成功執(zhí)行后都會(huì)刪除mycat.xa_log
中的xid
記錄
XA
第一個(gè)XA COMMIT
前會(huì)補(bǔ)上一個(gè)日志記錄,注意的是,插入日志的SQL與第一個(gè)連接處于同一個(gè)事務(wù),當(dāng)此COMMIT
成功,則日志記錄可查,即使往后的其它節(jié)點(diǎn)COMMIT
失敗也可以根據(jù)此記錄得知已經(jīng)COMMIT
了.如果找不到此記錄,則說明第一個(gè)XA COMMIT
失敗,那么此XID
的其它的XA PREPARE
都需要回滾.所有節(jié)點(diǎn)XA COMMIT
或者XA ROLLBACK
后刪除日志記錄.
如果上述過程沒有生效,則需要人工執(zhí)行(一般重起Mycat2即可自動(dòng)恢復(fù))
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: