當業務擴充到一定程度的時候,單個資料庫的性能産生瓶頸的時候,我們可能會對資料庫進行實體分區,也就是所謂的資料庫分庫分表,簡單來說就是單一資料庫變成了多個資料庫,此時當一個操作同時需要操作兩個資料庫的時候,就需要分布式事務進行管理。
拆分分布式事務,交由第三方處理
這種思路來源于eBay,了解起來比較簡單
此處我們舉一個電商的經典例子:扣庫存和更新訂單資料庫兩個操作,其中庫存資料庫和訂單資料庫為兩個獨立的資料庫。但是,當訂單更新狀态的時候進行抛出異常,那麼此時的庫存應該復原資料。先上圖
image.png
1、修改庫存操作;
2、修改庫存成功,寫消息事務表;
3、如果寫消息事務表,直接會滾資料,如果成功,則事務狀态未待執行;
4、生産者将消息放入隊列中;
5、消費者讀取隊列中的消息;
6、根據對應的消息,執行對應的更改訂單狀态的操作;
7、更改資料庫;
8、将更改成功與否的狀态座位放入隊列中;
9、讀取隊列;
10、如果成功、更改本地事務表為成功狀态,如果失敗則A事務會滾;
當然,這種方式中,存在消息放入隊列中失敗的可能,即步驟4失敗,是以我們需要有一個定時任務不斷的掃描本地事務表中的待執行的資料,把還沒處理完成的消息或者失敗的消息再發送一遍。
缺點:多一個表,因為添加了一個表,業務邏輯以外會有很多其他的邏輯處理