隨著時間和業務的發展,資料庫中表的資料量會越來越大,相應地,資料操作,增刪改查的開銷也會越來越大。因此,把其中一些大表進行拆分到多個資料庫中的多張表中。
本篇文章是基於非事務訊息的非同步確保的方式來完成分庫分表中的事務問題。
由於分庫分表之後,新錶在另外乙個資料庫中,如何保證主庫和分庫的事務性是必須要解決的問題。
解決辦法:通過在主庫中建立乙個流水表,把運算元據庫的邏輯對映為一條流水記錄。當整個大事務執行完畢後(流水被插入到流水表),然後通過其他方式來執行這段流水,保證最終一致性。
所謂流水,可以理解為一條事務訊息
上面通過在資料庫中建立一張流水表,使用一條流水記錄代表乙個業務處理邏輯,因此,乙個流水一定是能最終正確執行的.因此,當把一段業務**提取流水中必須要考慮到:
因此,提取流水的時候:
因為流水表是放在原資料庫中,而流水處理完成後是操作分庫,如果分庫操作完成去更新老表流水訊息,那麼又是誇庫事務,如何保證流水狀態的更新和分庫也是在乙個事務的?
解決辦法是:在分庫中建立乙個流水表,當流失處理完成以後,不是去更新老表狀態,而是插入分庫流水表中、
這樣做的好處:
注:流水執行器並不知道該流水表示什麼邏輯,具體需要業務系統去識別後去執行相對應業務邏輯。
流水處理排程任務就是通過掃瞄待處理的流水,然後通知業務系統該執行哪一條流水。
示意圖如下:
流水校驗任務就是要比較主庫和分庫中的流水記錄,對執行未成功的流水通知業務系統進行重新處理,如果多次重試失敗則發出告警。
流程示意圖:
由於是既有專案(網際網路金融,所以是絕對不容忍有任何訊息丟失或者訊息處理失敗)進行改造,不使用事務訊息有1個原因
資料庫主從表的處理 事務VS 資料級聯刪除
很多時候,我們會碰到這樣的場景 刪除乙個表的資料的時候,將另乙個表的相關資料刪除。這裡是建立兩張表的指令碼 create table dbo productcategory id uniqueidentifier not null,name varchar 50 null,constraint pk...
如何處理oracle資料庫新增列後順序的問題
工作中遇到 在為乙個表新增欄位後,新增欄位在最後,想調整新增欄位的位置。1 原始方法 新建臨時表以儲存正確的順序 create table a 2 as select column1,colum2,a表中的順序 from a 1 刪除表a 1 drop table a 1 新建a 1並從a 2表中賦...
如何處理Oracle資料庫中的壞塊
it專家網 一 什麼是資料庫的壞塊 首先我們來大概看一下資料庫塊的格式和結構 資料庫的資料塊有固定的格式和結構,分三層 cache layer,transaction layer,data layer。在我們對資料塊進行讀取寫入操作的時候,資料庫會對要讀寫的資料塊做一致性的檢查,其中包括 資料塊的型...