Seata的AT模式执行流程详解:
-
全局事务开始:
- 业务应用中的事务管理器(TM)向Seata Server(事务协调器TC)发送全局事务开始请求。
- TC接收到请求后,为该全局事务生成一个全局事务ID(XID)。
-
分支事务注册:
- 业务应用中的资源管理器(RM)向TC注册分支事务,包括全局事务ID(XID)、分支事务ID(Branch ID)以及分支事务参与者(即本地事务的执行者)等信息。
-
执行本地事务:
- 业务应用执行本地事务的业务逻辑,这通常涉及对数据库的更新操作。
- 在执行本地事务之前,Seata会拦截业务SQL,解析SQL语义,并找到要更新的业务数据。
- 在业务数据被更新前,Seata会保存一个“before image”(业务数据更新前的快照),然后执行业务SQL更新业务数据。
- 业务数据更新之后,Seata再保存一个“after image”(业务数据更新后的快照),并生成行锁。这些操作都在一个数据库事务内完成,以保证一阶段操作的原子性。
-
分支事务提交/回滚请求:
- 如果本地事务执行成功,RM会向TC发送分支事务提交请求。
- 如果本地事务执行失败,RM会向TC发送分支事务回滚请求。
-
全局事务提交/回滚决策:
- TC接收到所有分支事务的提交或回滚请求后,会根据请求的结果来决定是否进行全局事务的提交或回滚。
- 如果所有分支事务都提交成功,TC会向所有参与者发送全局事务提交请求。
- 如果有任何一个分支事务回滚,TC会向所有参与者发送全局事务回滚请求。
-
执行本地事务的最终提交/回滚:
- 参与者接收到全局事务提交请求后,会执行本地事务的最终提交操作。
- 参与者接收到全局事务回滚请求后,会根据undo_log日志中的快照数据来恢复业务数据到更新前的状态,即执行本地事务的回滚操作。