W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
我們經(jīng)常使用事務(wù)來保證數(shù)據(jù)庫層面數(shù)據(jù)的ACID特性。
舉個(gè)栗子,用戶下了一個(gè)訂單,需要修改余額表,訂單表,流水表,于是會(huì)有類似的偽代碼:
start transaction;commit;
如果對余額表,訂單表,流水表的SQL操作全部成功,則全部提交,如果任何一個(gè)出現(xiàn)問題,則全部回滾,以保證數(shù)據(jù)的一致性。
補(bǔ)償事務(wù)是一種在業(yè)務(wù)端實(shí)施業(yè)務(wù)逆向操作事務(wù),來保證業(yè)務(wù)數(shù)據(jù)一致性的方式。
舉個(gè)栗子,修改余額表事務(wù)為
int Do_AccountT(uid, money){同理,訂單表操作為
Do_OrderT,新增一個(gè)訂單
Compensate_OrderT,刪除一個(gè)訂單
該方案的不足是:
(1)不同的業(yè)務(wù)要寫不同的補(bǔ)償事務(wù),不具備通用性
(2)沒有考慮補(bǔ)償事務(wù)的失敗
(3)如果業(yè)務(wù)流程很復(fù)雜,if/else會(huì)嵌套非常多層
單庫是用這樣一個(gè)大事務(wù)保證一致性:
start transaction;commit;
拆分成了多個(gè)庫,大事務(wù)會(huì)變成三個(gè)小事務(wù):
start transaction1;第一個(gè)事務(wù)執(zhí)行200ms,提交1ms;
第二個(gè)事務(wù)執(zhí)行120ms,提交1ms;
第三個(gè)事務(wù)執(zhí)行80ms,提交1ms;
那在什么時(shí)候系統(tǒng)出現(xiàn)問題,會(huì)出現(xiàn)不一致呢?
回答:第一個(gè)事務(wù)成功提交之后,最后一個(gè)事務(wù)成功提交之前,如果出現(xiàn)問題(例如服務(wù)器重啟,數(shù)據(jù)庫異常等),都可能導(dǎo)致數(shù)據(jù)不一致。
第一個(gè)事務(wù)執(zhí)行200ms;
第二個(gè)事務(wù)執(zhí)行120ms;
第三個(gè)事務(wù)執(zhí)行80ms;
第一個(gè)事務(wù)提交1ms;
第二個(gè)事務(wù)提交1ms;
第三個(gè)事務(wù)提交1ms;
那在什么時(shí)候系統(tǒng)出現(xiàn)問題,會(huì)出現(xiàn)不一致呢?
問題的答案與之前相同:第一個(gè)事務(wù)成功提交之后,最后一個(gè)事務(wù)成功提交之前,如果出現(xiàn)問題(例如服務(wù)器重啟,數(shù)據(jù)庫異常等),都可能導(dǎo)致數(shù)據(jù)不一致。
這個(gè)變化的意義是什么呢?
方案一總執(zhí)行時(shí)間是303ms,最后202ms內(nèi)出現(xiàn)異常都可能導(dǎo)致不一致;
方案二總執(zhí)行時(shí)間也是303ms,但最后2ms內(nèi)出現(xiàn)異常才會(huì)導(dǎo)致不一致;
雖然沒有徹底解決數(shù)據(jù)的一致性問題,但不一致出現(xiàn)的概率大大降低了!
事務(wù)提交后置降低了數(shù)據(jù)不一致的出現(xiàn)概率,會(huì)帶來什么副作用呢?
回答:事務(wù)提交時(shí)會(huì)釋放數(shù)據(jù)庫的連接,第一種方案,第一個(gè)庫事務(wù)提交,數(shù)據(jù)庫連接就釋放了,后置事務(wù)提交的方案,所有庫的連接,要等到所有事務(wù)執(zhí)行完才釋放。這就意味著,數(shù)據(jù)庫連接占用的時(shí)間增長了,系統(tǒng)整體的吞吐量降低了。
trx3.commit();
這個(gè)小小的改動(dòng)(改動(dòng)成本極低),不能徹底解決多庫分布式事務(wù)數(shù)據(jù)一致性問題,但能大大降低數(shù)據(jù)不一致的概率,帶來的副作用是數(shù)據(jù)庫連接占用時(shí)間會(huì)增長,吞吐量會(huì)降低。對于一致性與吞吐量的折衷,還需要業(yè)務(wù)架構(gòu)師謹(jǐn)慎權(quán)衡折衷。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: