今天就跟大家聊聊有關(guān)數(shù)據(jù)庫(kù)分庫(kù)分表之后該如何解決事務(wù)問(wèn)題,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
公司主營(yíng)業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)推出延津免費(fèi)做網(wǎng)站回饋大家。
一、概述
隨著時(shí)間和業(yè)務(wù)的發(fā)展,數(shù)據(jù)庫(kù)中表的數(shù)據(jù)量會(huì)越來(lái)越大,相應(yīng)地,數(shù)據(jù)操作,增刪改查的開(kāi)銷也會(huì)越來(lái)越大。因此,把其中一些大表進(jìn)行拆分到多個(gè)數(shù)據(jù)庫(kù)中的多張表中。
本篇文章是基于非事務(wù)消息的異步確保的方式來(lái)完成分庫(kù)分表中的事務(wù)問(wèn)題。
二、需要解決問(wèn)題
2.1 原有事務(wù)
由于分庫(kù)分表之后,新表在另外一個(gè)數(shù)據(jù)庫(kù)中,如何保證主庫(kù)和分庫(kù)的事務(wù)性是必須要解決的問(wèn)題。
解決辦法:通過(guò)在主庫(kù)中創(chuàng)建一個(gè)流水表,把操作數(shù)據(jù)庫(kù)的邏輯映射為一條流水記錄。當(dāng)整個(gè)大事務(wù)執(zhí)行完畢后(流水被插入到流水表),然后通過(guò)其他方式來(lái)執(zhí)行這段流水,保證最終一致性。
2.2 流水
所謂流水,可以理解為一條事務(wù)消息
上面通過(guò)在數(shù)據(jù)庫(kù)中創(chuàng)建一張流水表,使用一條流水記錄代表一個(gè)業(yè)務(wù)處理邏輯,因此,一個(gè)流水一定是能最終正確執(zhí)行的.因此,當(dāng)把一段業(yè)務(wù)代碼提取流水中必須要考慮到:
流水延遲處理性。流水不是實(shí)時(shí)處理的,而是用過(guò)流水執(zhí)行器來(lái)異步執(zhí)行的。因此,如果在原有邏輯中,需要特別注意后續(xù)流程對(duì)該流水是不是有實(shí)時(shí)依賴性(例如后續(xù)業(yè)務(wù)邏輯中會(huì)使用流水結(jié)果來(lái)做一些計(jì)算等)。
流水處理無(wú)序性。保證即使后生成的流水先執(zhí)行,也不能出現(xiàn)問(wèn)題。
流水最終成功性。對(duì)每條插入的流水,該條流水一定要保證能執(zhí)行成功
因此,提取流水的時(shí)候:
流水處理越簡(jiǎn)單越好
流失處理依賴越少越好
提取的流水在該業(yè)務(wù)邏輯中無(wú)實(shí)時(shí)性依賴
2.3 流水處理完成
因?yàn)榱魉硎欠旁谠瓟?shù)據(jù)庫(kù)中,而流水處理完成后是操作分庫(kù),如果分庫(kù)操作完成去更新老表流水消息,那么又是夸庫(kù)事務(wù),如何保證流水狀態(tài)的更新和分庫(kù)也是在一個(gè)事務(wù)的?
解決辦法是:在分庫(kù)中創(chuàng)建一個(gè)流水表,當(dāng)流失處理完成以后,不是去更新老表狀態(tài),而是插入分庫(kù)流水表中、
這樣做的好處:
一般會(huì)對(duì)流水做唯一索引,那么如果流水重復(fù)多次執(zhí)行的時(shí)候,插入分庫(kù)流水表的時(shí)候肯定由于唯一索引檢測(cè)不通過(guò),整個(gè)事務(wù)就會(huì)回滾(當(dāng)然也可以在處理流水事前應(yīng)該再做一下冪等性判斷)
這樣通過(guò)判斷主庫(kù)流水是否在分庫(kù)中就能判斷一條流水是否執(zhí)行完畢
三、流水處理器基本框架
流水處理器其實(shí)不包含任何業(yè)務(wù)相關(guān)的處理邏輯,核心功能就是:
通知業(yè)務(wù)接入方何時(shí)處理什么樣的流水
檢驗(yàn)流水執(zhí)行的成功
注:流水執(zhí)行器并不知道該流水表示什么邏輯,具體需要業(yè)務(wù)系統(tǒng)去識(shí)別后去執(zhí)行相對(duì)應(yīng)業(yè)務(wù)邏輯。
3.1 流水執(zhí)行任務(wù)
流水處理調(diào)度任務(wù)就是通過(guò)掃描待處理的流水,然后通知業(yè)務(wù)系統(tǒng)該執(zhí)行哪一條流水。
示意圖如下:
3.2 流水校驗(yàn)任務(wù)
流水校驗(yàn)任務(wù)就是要比較主庫(kù)和分庫(kù)中的流水記錄,對(duì)執(zhí)行未成功的流水通知業(yè)務(wù)系統(tǒng)進(jìn)行重新處理,如果多次重試失敗則發(fā)出告警。
流程示意圖:
四、為什么不用事務(wù)消息
由于是既有項(xiàng)目(互聯(lián)網(wǎng)金融,所以是絕對(duì)不容忍有任何消息丟失或者消息處理失?。┻M(jìn)行改造,不使用事務(wù)消息有1個(gè)原因
需要額外引入消息隊(duì)列,增加系統(tǒng)的復(fù)雜度,而且也需要額外的邏輯保證和消息隊(duì)列通訊失敗的時(shí)候處理
其實(shí)1不算是主要原因,而是因?yàn)槭聞?wù)消息需要手動(dòng)的commit和rollback(使用數(shù)據(jù)庫(kù)不需要),那么問(wèn)題來(lái)了,spring中事務(wù)是有傳遞性的,那我們事務(wù)消息何時(shí)提交又是個(gè)大問(wèn)題,例如 A.a()本來(lái)就是一個(gè)事務(wù), 但是另外一個(gè)事務(wù)B.b()中又調(diào)用了A.a() 那事務(wù)消息提交是放在A.a()還是B.b()中呢?
看完上述內(nèi)容,你們對(duì)數(shù)據(jù)庫(kù)分庫(kù)分表之后該如何解決事務(wù)問(wèn)題有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。