分布式事务

什么是本地事务

ACID

分布式事务解决什么问题

CAP

不能同时满足,只能 CP(强一致性)、AP(确保可用性,不能保证一致性)

BASE

分布式事务的解决方案

可靠事件队列

原理

将最容易出错的业务放到本地事务执行,后续其他业务只需成功不许失败(如果一直失败,人工介入)

比如转账(账户 A、账户 B 在不同的服务器上),账户 A 扣 30,账户 B 加 30

  1. 账户 A 扣除 30,并保存到本地消息表状态为进行中,放到一个事务中。如果失败就会滚,后续不会执行。
  2. 消息服务会定时轮询消息表,状态为进行中的消息发送给账户 B。
  3. 账户 B 收到消息处理加 30 操作,如果处理失败循环直至成功,处理成功更新消息表已完成。
  4. 第 3 步如果由于网络原因无法更新消息表,消息服务会重发消息给账户 B,此时需要保证消息幂等性。

优点

缺点

TCC 事务

原理

Try-Confirm-Cancel

比如转账(账户 A、账户 B 在不同的服务器上),账户 A 扣 30,账户 B 加 30

  1. try 阶段:账户 A 预留 30 块钱,处于冻结状态。可行进入 conform 阶段,不可行进入 cancel 阶段。账户 B 检查业务可行性不需要预留资源
  2. confirm 阶段:如果第 1 步都可行,账户 A 扣减预留的 30,账户 B 加 30
  3. 如果第 2 步全部完成,事务正常结束。如果任何一方出现异常,重复执行 confirm 操作,尽最大努力交付
  4. 如果第 1 步任何一方反馈不行,进入 cancel 阶段。账户 A 释放冻结的 30 块钱,账户 B 取消业务
  5. 如果第 4 步全部完成,事务正常回滚。如果有任何一方异常,重复执行 cancel 操作,尽最大努力交付

http://image-1313007945.cos.ap-nanjing.myqcloud.com/image/1659714532.png

优点

缺点

SAGA 事务

原理

比如转账(账户 A、账户 B 在不同的服务器上),账户 A 扣 30(补偿操作:账户 A 加 30 元),账户 B 加 30(补偿操作:账户 B 扣 30 元)

假如账户 B 加 30 失败,会执行补偿操作,补偿操作需要有幂等性,补偿操作失败会不断重试直到成功(理论上不允许失败)

http://image-1313007945.cos.ap-nanjing.myqcloud.com/image/1659714571.png

优点

缺点

总结