分布式事务


假设现在客人下单成功了,我们需要落订单信息,调整库存信息,落订单快照信息等多项操作,但是这些信息在不同的数据库集群中,如何通过事务保证数据准确呢?

两段式提交(2PC)

在这里插入图片描述
何为两段式提交?两段式提交,即为通过一个中间者TM来协调所有数据库的动作,TM先发送预提交指令(第一阶段),再发送提交/回滚指令(第二阶段)具体过程如下:

  1. client提交事务请求到TM
  2. TM向每个数据库发送可以提交指令
  3. 每个数据库处理自己的数据(增删改),如数据库1写入订单信息,数据库2更新库存信息,数据库3写入快照信息等,注意此时只是处理,数据并不commit
  4. 每个数据库将处理的结果告知TM
  5. TM汇总所有数据库的执行结果,如果都已经成功,则给所有数据库发送commit命令,如果有一个执行失败,则发送回滚指令
  6. 每个数据库根据步骤5发出的指令执行commit或者rollback
  7. 数据库将commit/rollback执行结果回执给TM

我们仔细分析上上面的几个步骤,不难看出,每一步都有一个中枢TM参与,并且每一个过程都是同步的,所以两段式提交有下面几个问题:

  • 严重依赖TM,如果协调者TM出现异常,系统将无法工作
  • 每一个步骤都是同步等待,如果某一步出现异常,后续步骤只能等待。并且,在数据库最终commit/rollback之前,是需要锁定当前资源的,整个分布式环境是阻塞的。
  • 如果出现网络波动,很容易出现数据不一致性。比如步骤5,如果数据库1,2收到了commit指令,但是数据库3因网络波动,没有收到commit指令,最终就会出现一个事务中,部分数据写入成功,部分写入失败的情况。

综上,两段提交,无法完全保证事务的完整性。

三段式提交(3PC)

针对2PC存在的问题,提出3PC设定,包含问询、预提交、提交三个阶段:

  1. TM发送canCommit指令到每个数据库
  2. 每个数据库向TM发送yes/no表示是否可以提交,如果全部yes,则走步骤3,如果不是则rollback
  3. TM向每个数据库发送PreCommit预提交指令
  4. 每个数据库向TM发送预提交指令执行结果,注意次步骤中引入超时机制,如果任何一个数据库向TM发送了失败指令,或者TM在超过等待之后没有收到指令,则中断事务请求,重新给每个数据库发送rollback指令
  5. TM在收到全部yes的情况下,发送DoCommit指令
  6. 每个数据库执行commit操作,并将commit结果回执给TM
  7. 和步骤4一样,如果 TM收到失败或者超时没有收到,则执行rollback

3PC vs 2PC

  • 3PC增加了问询,会提升一点成功的概率
  • 3PC对协调者™和参与者(数据库)都设立了超时机制,如果TM在某一步挂了,参与者默认提交事务。2PC只有协调者TM有超时机制,如果TM超时没有收到消息,默认失败。

同2PC一样,3PC也无法100%保证事务的完整性。

基于消息的一致性

针对上面的例子,我们简化下操作,只写入订单信息和更新库存信息:
在这里插入图片描述

  1. 在订单库和库存库中分别新增两种任务表
  2. 新建订单数据,并写入订单表
  3. 将插入数据事件,写入任务表,status=new
  4. 由定时任务,每隔一段时间从任务表中取出status=new的数据,将其放入MQ,同时将表中该条数据status改成published
  5. 在处理库存的逻辑中,监听该消息队列,当收到消息之后,将该消息写入库存库中的任务表
  6. 由定时任务每隔一段时间从任务表中取出status=published的数据,根据里面的内容更新库存信息,并写入数据库。

其中步骤1、2、3应该作为一个本地事务执行,步骤4、5作为一个本地事务执行,步骤6、7作为本地事务执行,8、9、10作为本地事务执行。
该方案通过中间件MQ实现事务的最终一致性。

分布式事务,目前无法百分百保证事务的一致性和完整性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值