分享

关于银行转账引发的分布式事务思考

 liang1234_ 2020-08-25

转载自: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银行会根据处理结果进行回滚。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多