Seata的AT模式的执行流程

135 阅读2分钟

image.png

Seata的AT模式执行流程详解

  1. 全局事务开始

    • 业务应用中的事务管理器(TM)向Seata Server(事务协调器TC)发送全局事务开始请求。
    • TC接收到请求后,为该全局事务生成一个全局事务ID(XID)。
  2. 分支事务注册

    • 业务应用中的资源管理器(RM)向TC注册分支事务,包括全局事务ID(XID)、分支事务ID(Branch ID)以及分支事务参与者(即本地事务的执行者)等信息。
  3. 执行本地事务

    • 业务应用执行本地事务的业务逻辑,这通常涉及对数据库的更新操作。
    • 在执行本地事务之前,Seata会拦截业务SQL,解析SQL语义,并找到要更新的业务数据。
    • 在业务数据被更新前,Seata会保存一个“before image”(业务数据更新前的快照),然后执行业务SQL更新业务数据。
    • 业务数据更新之后,Seata再保存一个“after image”(业务数据更新后的快照),并生成行锁。这些操作都在一个数据库事务内完成,以保证一阶段操作的原子性。
  4. 分支事务提交/回滚请求

    • 如果本地事务执行成功,RM会向TC发送分支事务提交请求。
    • 如果本地事务执行失败,RM会向TC发送分支事务回滚请求。
  5. 全局事务提交/回滚决策

    • TC接收到所有分支事务的提交或回滚请求后,会根据请求的结果来决定是否进行全局事务的提交或回滚。
    • 如果所有分支事务都提交成功,TC会向所有参与者发送全局事务提交请求。
    • 如果有任何一个分支事务回滚,TC会向所有参与者发送全局事务回滚请求。
  6. 执行本地事务的最终提交/回滚

    • 参与者接收到全局事务提交请求后,会执行本地事务的最终提交操作。
    • 参与者接收到全局事务回滚请求后,会根据undo_log日志中的快照数据来恢复业务数据到更新前的状态,即执行本地事务的回滚操作。