一阶段(准备阶段):
1.1 开启本地事务:事务开始时,首先开启本地事务。 1.2 执行业务SQL:执行业务操作相关的SQL语句。 1.3 保存快照:在业务数据被更新前,Seata会保存数据的"before image"(即快照),然后执行业务SQL更新业务数据。在业务数据更新之后,再保存"after image"。 1.4 生成行锁:最后生成行锁,确保在全局事务未完成前,其他事务不能修改这些数据。 1.5 提交本地事务:在本地事务提交前,需要先拿到全局锁,确保在全局事务中数据的一致性。本地事务提交后,会释放本地锁。
二阶段(提交/回滚阶段):
-
全局提交:
- 如果全局事务决策是提交,那么Seata会异步删除保存的快照数据和行锁,完成数据清理工作。
-
全局回滚:
- 如果全局事务需要回滚,Seata会使用保存的"before image"来还原业务数据,回滚一阶段已经执行的业务SQL。在还原前,会先校验脏写,对比数据库当前业务数据和"after image",如果一致则说明没有脏写,可以进行数据还原;如果不一致,则说明有脏写,需要人工介入处理。### 一阶段(准备阶段):