zoukankan      html  css  js  c++  java
  • 关于银行转账引发的分布式事务思考

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

  • 相关阅读:
    不为人知easy-mock-cli
    javascript设计模式之适配器模式
    js --装饰者模式
    使用策略模式封装拦截器
    js --桥接模式
    深入理解面向对象 -- 基于 JavaScript 实现
    设计模式 -- 观察者模式
    敏捷开发
    从技术走向管理
    Vue Cli安装以及使用
  • 原文地址:https://www.cnblogs.com/zlbx/p/11095594.html
Copyright © 2011-2022 走看看