關於銀行轉賬引發的分布式事務思考


轉載自: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銀行會根據處理結果進行回滾。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM