12.5、AT模式原理
AT 模式原理
AT 模式是 Seata 的推荐模式,理解其原理有助于我们更好地使用 AT 模式。本节将学习 AT 模式原理。
本章节内容参考官方文档顺序: 根据 Seata 官方文档 - AT Mode,官方文档按照以下顺序讲解:
- AT Mode Overview(AT 模式概览)
- Two-Phase Commit(两阶段提交)
- DataSource Proxy(数据源代理)
- Undo Log(Undo 日志)
- Global Lock(全局锁)
- Rollback Mechanism(回滚机制)
本节将学习:AT 模式工作流程、数据源代理、Undo Log 机制、全局锁机制,以及回滚机制。
AT 模式工作流程
官方定义
根据 Seata 官方文档 - AT Mode,AT 模式的定义是:
AT 模式 是一种无侵入的分布式事务解决方案。在 AT 模式下,用户只需关注自己的"业务 SQL",Seata 框架会自动生成事务的回滚日志。用户在编写业务代码时,只需使用
@GlobalTransactional注解即可。
两阶段提交
根据官方文档,AT 模式采用两阶段提交协议:
第一阶段(Phase 1):执行业务 SQL 并生成 Undo Log
- 执行业务 SQL:在本地事务中执行业务 SQL,更新业务数据
- 生成 Undo Log:数据源代理自动生成 Undo Log,记录数据变更前的镜像
- 提交本地事务:提交本地事务,释放本地锁和数据库连接资源
- 注册分支事务:向 TC(事务协调者)注册分支事务
第二阶段(Phase 2):提交或回滚
- 提交:如果全局事务成功,TC 通知所有 RM(资源管理器)删除 Undo Log
- 回滚:如果全局事务失败,TC 通知所有 RM 根据 Undo Log 回滚数据
流程图
数据源代理
代理机制
根据官方文档,数据源代理是 AT 模式的核心机制:
数据源代理的作用:
- 拦截 SQL 执行:在 SQL 执行前,拦截 SQL 语句
- 解析 SQL:解析 SQL 语句,获取表名、操作类型等信息
- 查询前镜像:执行 SQL 前,查询数据的前镜像(Before Image)
- 执行 SQL:执行业务 SQL,更新数据
- 查询后镜像:执行 SQL 后,查询数据的后镜像(After Image)
- 生成 Undo Log:根据前后镜像生成 Undo Log,保存到
undo_log表中 - 注册分支事务:向 TC 注册分支事务
代理配置
@Configuration public class DataSourceProxyConfig { @Bean @ConfigurationProperties("spring.datasource") public DataSource dataSource() { return new DruidDataSource(); } @Bean public DataSourceProxy dataSourceProxy(DataSource dataSource) { return new DataSourceProxy(dataSource); } }
Undo Log 机制
Undo Log 作用
根据官方文档,Undo Log 是 AT 模式实现回滚的关键:
Undo Log 的作用:
- 记录数据变更:记录数据变更前的镜像(Before Image)
- 支持回滚:回滚时根据 Undo Log 恢复数据
- 保证一致性:确保分布式事务的一致性
Undo Log 结构
Undo Log 表结构(undo_log):
CREATE TABLE `undo_log` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `branch_id` bigint(20) NOT NULL, `xid` varchar(100) NOT NULL, `context` varchar(128) NOT NULL, `rollback_info` longblob NOT NULL, `log_status` int(11) NOT NULL, `log_created` datetime(6) NOT NULL, `log_modified` datetime(6) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
全局锁机制
锁的作用
根据官方文档,全局锁用于防止脏写:
全局锁机制:
- 防止脏写:在全局事务提交前,防止其他事务修改相同的数据
- 保证数据一致性:确保分布式事务的数据一致性
- 锁冲突检测:检测锁冲突,如果发生冲突则回滚事务
锁的获取
- 获取时机:在分支事务提交时,向 TC 申请全局锁
- 锁的释放:全局事务提交或回滚时,释放全局锁
- 锁冲突处理:如果获取锁失败,分支事务回滚
回滚机制
回滚流程
回滚机制:
- 读取 Undo Log
- 生成反向 SQL
- 执行回滚
官方资源
-
AT 模式原理:官方文档详细说明了 AT 模式的工作原理,包括两阶段提交、数据源代理、Undo Log 机制、全局锁机制等。文档强调,AT 模式对业务代码零侵入,只需使用
@GlobalTransactional注解即可。 -
两阶段提交:官方文档详细描述了 AT 模式的两阶段提交流程,包括第一阶段执行业务 SQL 和生成 Undo Log,第二阶段提交或回滚。文档说明了每个阶段的具体操作和注意事项。
-
数据源代理:官方文档详细说明了数据源代理的机制,包括如何拦截 SQL、如何生成 Undo Log、如何注册分支事务等。文档提供了数据源代理的配置示例。
-
Undo Log 机制:官方文档详细说明了 Undo Log 的作用和结构,包括如何记录数据变更、如何支持回滚等。文档提供了 Undo Log 表的创建脚本。
-
全局锁机制:官方文档详细说明了全局锁的作用和获取方式,包括如何防止脏写、如何保证数据一致性等。文档说明了锁冲突的处理方式。
参考资源:
- Seata AT 模式:https://seata.io/docs/dev/mode/at-mode/
- Seata 快速开始:https://seata.io/docs/user/quickstart/
本节小结
在本节中,我们学习了:
第一个是 AT 模式工作流程。 两阶段提交流程。
第二个是数据源代理。 SQL 拦截和 Undo Log 生成。
第三个是全局锁机制。 防止脏写的锁机制。
第四个是回滚机制。 基于 Undo Log 的回滚。
这就是 AT 模式原理。理解原理,有助于我们更好地使用 AT 模式。
在下一节,我们将学习 AT 模式实战。