面试题答案
一键面试一、Spring Cloud Seata AT 模式工作原理概述
Spring Cloud Seata 的 AT 模式是一种无侵入的分布式事务解决方案。它基于数据库的本地事务来实现分布式事务,通过对业务 SQL 的解析和执行过程的干预,来完成分布式事务的处理。
二、一阶段操作流程
- 业务 SQL 执行:
- 业务服务发起数据库操作,如
INSERT
、UPDATE
、DELETE
等 SQL 语句。 - Seata 的代理数据源(
AutoDataSource
)拦截这些 SQL 语句。
- 业务服务发起数据库操作,如
- 数据快照:
- 在执行 SQL 之前,Seata 会根据 SQL 类型对相关数据进行快照。
- 对于
UPDATE
操作,会记录修改前的数据镜像;对于INSERT
操作,会记录插入的数据;对于DELETE
操作,会记录删除前的数据。这些数据快照会存储在 Seata 的undo_log
表中。
- 本地事务提交:
- Seata 将业务 SQL 和
undo_log
放在同一个本地事务中提交。如果本地事务提交成功,说明一阶段执行成功,此时业务数据的状态是已修改但未最终确认在分布式事务中生效。
- Seata 将业务 SQL 和
三、二阶段操作流程
- 提交阶段:
- 当所有参与分布式事务的分支事务一阶段都执行成功后,进入二阶段提交。
- 协调器向所有分支事务发送提交请求。
- 各分支事务接收到提交请求后,直接删除
undo_log
表中的数据,因为此时业务数据已确定在分布式事务中生效,不需要回滚了,然后完成本地事务提交。
- 回滚阶段:
- 如果有任何一个分支事务一阶段执行失败,协调器会向所有分支事务发送回滚请求。
- 分支事务接收到回滚请求后,根据
undo_log
表中的数据镜像,将数据恢复到修改前的状态,然后完成本地事务回滚,从而保证业务数据的一致性。
四、保证数据一致性的机制
- 基于本地事务:利用数据库本地事务的原子性,保证业务 SQL 和
undo_log
操作的一致性,即要么都成功,要么都失败。 - 数据快照与回滚:通过
undo_log
记录数据的修改前镜像,在回滚时能够准确恢复数据,确保即使部分分支事务失败,也能将所有数据恢复到事务开始前的状态,从而保证整个分布式事务的数据一致性。 - 协调器的统一控制:Seata 的协调器负责管理分布式事务的全局状态,协调各分支事务的提交和回滚,确保所有分支事务按照统一的规则进行操作,避免出现部分提交、部分回滚的不一致情况。