12.5AT模式原理

分类: Seata分布式事务

AT 模式原理

AT 模式是 Seata 的推荐模式,理解其原理有助于我们更好地使用 AT 模式。本节将学习 AT 模式原理。

本章节内容参考官方文档顺序: 根据 Seata 官方文档 - AT Mode,官方文档按照以下顺序讲解:

  1. AT Mode Overview(AT 模式概览)
  2. Two-Phase Commit(两阶段提交)
  3. DataSource Proxy(数据源代理)
  4. Undo Log(Undo 日志)
  5. Global Lock(全局锁)
  6. Rollback Mechanism(回滚机制)

本节将学习:AT 模式工作流程、数据源代理、Undo Log 机制、全局锁机制,以及回滚机制。

AT 模式工作流程

官方定义

根据 Seata 官方文档 - AT Mode,AT 模式的定义是:

AT 模式 是一种无侵入的分布式事务解决方案。在 AT 模式下,用户只需关注自己的"业务 SQL",Seata 框架会自动生成事务的回滚日志。用户在编写业务代码时,只需使用 @GlobalTransactional 注解即可。

两阶段提交

根据官方文档,AT 模式采用两阶段提交协议:

第一阶段(Phase 1):执行业务 SQL 并生成 Undo Log

  1. 执行业务 SQL:在本地事务中执行业务 SQL,更新业务数据
  2. 生成 Undo Log:数据源代理自动生成 Undo Log,记录数据变更前的镜像
  3. 提交本地事务:提交本地事务,释放本地锁和数据库连接资源
  4. 注册分支事务:向 TC(事务协调者)注册分支事务

第二阶段(Phase 2):提交或回滚

  • 提交:如果全局事务成功,TC 通知所有 RM(资源管理器)删除 Undo Log
  • 回滚:如果全局事务失败,TC 通知所有 RM 根据 Undo Log 回滚数据

流程图

数据源代理

代理机制

根据官方文档,数据源代理是 AT 模式的核心机制:

数据源代理的作用:

  1. 拦截 SQL 执行:在 SQL 执行前,拦截 SQL 语句
  2. 解析 SQL:解析 SQL 语句,获取表名、操作类型等信息
  3. 查询前镜像:执行 SQL 前,查询数据的前镜像(Before Image)
  4. 执行 SQL:执行业务 SQL,更新数据
  5. 查询后镜像:执行 SQL 后,查询数据的后镜像(After Image)
  6. 生成 Undo Log:根据前后镜像生成 Undo Log,保存到 undo_log 表中
  7. 注册分支事务:向 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 的作用:

  1. 记录数据变更:记录数据变更前的镜像(Before Image)
  2. 支持回滚:回滚时根据 Undo Log 恢复数据
  3. 保证一致性:确保分布式事务的一致性

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;

全局锁机制

锁的作用

根据官方文档,全局锁用于防止脏写:

全局锁机制:

  1. 防止脏写:在全局事务提交前,防止其他事务修改相同的数据
  2. 保证数据一致性:确保分布式事务的数据一致性
  3. 锁冲突检测:检测锁冲突,如果发生冲突则回滚事务

锁的获取

  • 获取时机:在分支事务提交时,向 TC 申请全局锁
  • 锁的释放:全局事务提交或回滚时,释放全局锁
  • 锁冲突处理:如果获取锁失败,分支事务回滚

回滚机制

回滚流程

回滚机制:

  • 读取 Undo Log
  • 生成反向 SQL
  • 执行回滚

官方资源

根据 Seata 官方文档 - AT Mode

  1. AT 模式原理:官方文档详细说明了 AT 模式的工作原理,包括两阶段提交、数据源代理、Undo Log 机制、全局锁机制等。文档强调,AT 模式对业务代码零侵入,只需使用 @GlobalTransactional 注解即可。

  2. 两阶段提交:官方文档详细描述了 AT 模式的两阶段提交流程,包括第一阶段执行业务 SQL 和生成 Undo Log,第二阶段提交或回滚。文档说明了每个阶段的具体操作和注意事项。

  3. 数据源代理:官方文档详细说明了数据源代理的机制,包括如何拦截 SQL、如何生成 Undo Log、如何注册分支事务等。文档提供了数据源代理的配置示例。

  4. Undo Log 机制:官方文档详细说明了 Undo Log 的作用和结构,包括如何记录数据变更、如何支持回滚等。文档提供了 Undo Log 表的创建脚本。

  5. 全局锁机制:官方文档详细说明了全局锁的作用和获取方式,包括如何防止脏写、如何保证数据一致性等。文档说明了锁冲突的处理方式。

参考资源

本节小结

在本节中,我们学习了:

第一个是 AT 模式工作流程。 两阶段提交流程。

第二个是数据源代理。 SQL 拦截和 Undo Log 生成。

第三个是全局锁机制。 防止脏写的锁机制。

第四个是回滚机制。 基于 Undo Log 的回滚。

这就是 AT 模式原理。理解原理,有助于我们更好地使用 AT 模式。

在下一节,我们将学习 AT 模式实战。