轉載自:https://www.cnblogs.com/sujing/p/11006424.html
數據庫的四大特征:原子性、一致性、隔離性、持久性。
分布式理論
CAP理論,一個分布式系統不可能同時滿足一致性、可用性、分區容錯性三個基本需求,最多同時只能滿足其中兩項。
一致性:在分布式系統中,數據在多個副本之間能否保持一致的特性,也就是說對某個數據進行寫操作后立馬執行讀操作,必須能讀取到剛剛寫入的值。
可用性:任意被無故障節點接收到的請求,必須能夠在有限的時內響應結果。
分區容錯性:如果集群中的機器被分成了兩部分,這兩部分不能互相通信,系統是否能繼續正常工作。
分布式事務
分布式事務的解決方案有很多,如XA協議、TCC三階段提交、基於消息隊列等等,以下以基於消息隊列為例,流程如下:
1、A銀行對賬戶進行檢查校驗、進行全額扣減,並存到轉賬流水表;
2、將對B銀行的請求異步寫入隊列,主線程返回;
3、啟動后台程序從隊列獲取待處理數據;
4、后台程序對B銀行接口進行遠程調用;
5、定期的從轉賬流水表中讀取狀態為“待處理”且最后更新的時間距當前時間大於某個閾值的數據,調用B銀行處理結果查詢接口,若未查到結果則重新放入消息隊列進行補償,若查到則更新該數據狀態;
6、B銀行對轉入賬戶進行檢查校驗,根據唯一轉賬流水Id在轉賬日志表中查找判斷該轉賬是否已經處理過,若未處理則進行金額增加,並存到轉賬日志表,否則直接返回日志表處理結果;
7、B銀行處理完成后回調A銀行接口通知處理結果;
轉賬流水表設計如下:
字段名稱 | 字段描述 |
id | 交易流水id |
accountNo | 銀行賬戶 |
targetBankNo | 目標銀行編碼 |
targetAccountNo | 目標銀行卡號 |
targetAccountName | 目標銀行卡持卡人姓名 |
amount | 交易金額 |
status | 交易處理狀態(待處理、處理成功、處理失敗) |
createTime | 創建時間 |
lastUpdateTime | 最后更新時間 |
轉賬日志表:
字段名稱 | 字段描述 |
id | 編號 |
transId | 交易流水號,對應轉賬流水表id |
sourceAccountNo | 源銀行賬戶,對應轉賬流水表accountNo |
targetAccountNo | 目標銀行卡號,對應轉賬流水表targetAccountNo |
targetAccountName | 目標銀行卡持卡人姓名,對應轉賬流水表targetAccountName |
amount | 交易金額 |
status | 交易處理狀態(處理成功、處理失敗) |
createTime | 創建時間 |
以上A銀行通過本地事務保證日志記錄+后台線程輪詢保證消息不丟失。B銀行通過本地事務保證日志記錄從而保證消息不重復消費!B銀行在回調A銀行的接口時會通知處理結果,如果轉賬失敗,A銀行會根據處理結果進行回滾。