steata解决分布式事务之at模式

80 阅读1分钟

Seata的AT模式

基本可以概况为一张图:

1.png

阶段一RM的工作:

  • 注册分支事务
  • 记录undo-log(数据快照)
  • 执行业务sql并提交(这里会将锁给释放,性能高)
  • 报告事务状态

阶段二提交时RM的工作:

  • 删除undo-log即可

阶段二回滚时RM的工作:

  • 根据undo-log恢复数据到更新前

AT模式会保证数据的最终一致性。

举例说明

用一个模拟的业务来梳理下AT模式的原理。

比如,现在有一个数据库表,记录用户余额:

idmoney
1100

其中一个分支业务要执行的SQL为:

 update account set money = money - 10 where id = 1

AT模式下,当前分支事务执行流程如下:

一阶段

  1. TM发起并注册全局事务到TC
  2. TM调用分支事务
  3. 分支事务准备执行业务SQL
  4. RM拦截业务SQL,根据where条件查询原始数据,形成快照。
{
  "id": 1, "money": 100
}
  1. RM执行业务SQL,提交本地事务,释放数据库锁。此时 money = 90
  2. RM报告本地事务状态给TC

二阶段

  1. TM通知TC事务结束
  2. TC检查分支事务状态
    1. 如果都成功,则立即删除快照
    2. 如果有分支事务失败,需要回滚。读取快照数据({"id": 1, "money": 100}),将快照恢复到数据库。此时数据库再次恢复为100