咱們須要接受失望,由於它是有限的;咱們不會失去但願,由於它是無窮的。spring
隨着時間和業務的發展,數據庫中表的數據量會愈來愈大,相應地,數據操做,增刪改查的開銷也會愈來愈大。所以,把其中一些大表進行拆分到多個數據庫中的多張表中。
本篇文章是基於非事務消息的異步確保的方式來完成分庫分表中的事務問題。數據庫
因爲分庫分表以後,新表在另一個數據庫中,如何保證主庫和分庫的事務性是必需要解決的問題。微信
解決辦法:經過在主庫中建立一個流水錶,把操做數據庫的邏輯映射爲一條流水記錄。當整個大事務執行完畢後(流水被插入到流水錶),而後經過其餘方式來執行這段流水,保證最終一致性。
框架
所謂流水,能夠理解爲一條事務消息異步
上面經過在數據庫中建立一張流水錶,使用一條流水記錄表明一個業務處理邏輯,所以,一個流水必定是能最終正確執行的.所以,當把一段業務代碼提取流水中必需要考慮到:spa
所以,提取流水的時候:blog
由於流水錶是放在原數據庫中,而流水處理完成後是操做分庫,若是分庫操做完成去更新老表流水消息,那麼又是誇庫事務,如何保證流水狀態的更新和分庫也是在一個事務的?索引
解決辦法是:在分庫中建立一個流水錶,當流失處理完成之後,不是去更新老表狀態,而是插入分庫流水錶中、隊列
這樣作的好處:圖片
流水處理器其實不包含任何業務相關的處理邏輯,核心功能就是:
注:流水執行器並不知道該流水錶示什麼邏輯,具體須要業務系統去識別後去執行相對應業務邏輯。
流水處理調度任務就是經過掃描待處理的流水,而後通知業務系統該執行哪一條流水。
示意圖以下:
流水校驗任務就是要比較主庫和分庫中的流水記錄,對執行未成功的流水通知業務系統進行從新處理,若是屢次重試失敗則發出告警。
流程示意圖:
因爲是既有項目(互聯網金融,因此是絕對不容忍有任何消息丟失或者消息處理失敗)進行改造,不使用事務消息有1個緣由