适用场景
Seata AT模式是无侵入的分布式事务解决方案,适用于不希望对业务进行改造的场景,几乎0学习成本。在业务开发过程中,开发人员只需要关注自己需要处理的业务逻辑即可,编码方式几乎和没有分布式事务一样,Seata AT模式会自动完成二阶段的提交和回滚操作。
从上图可以看出,整个业务功能开发中,只有业务SQL
这块是需要开发人员关心的,其他阶段全部交由Seata框架来托管。
原理
- 一阶段
在一阶段,Seata会针对DataSource进行代理,从而拿到用户需要执行的业务SQL,通过对业务SQL的语义解析,在业务数据被更改前,记录为BeforeImage
,然后再执行业务SQL,在业务数据更改后的,将其记录为AfterImage
,并生成行锁(通过RM分支事务注册的方式),最后提交本地数据库事务。上述操作必须在一个数据库事务内完成,保证一阶段的原子性。
- 二阶段提交
如果所有的分支事务一阶段全部提交成功,那么二阶段只需要删除一阶段记录的BeforeImage
、AfterImage
和行锁即可。
二阶段回滚
如果一阶段一旦有任何的分支事务出现异常或者产生超时,都会触发Seata发起全局事务的回滚指令。Seata利用一阶段记录的BeforeImage
生成反向SQL来还原业务数据。默认情况下,在还原前需要校验当前业务数据是否与AfterImage
记录的数据一致来判断是否被脏写
了。如果出现数据被脏写
的情况,就需要人工介入处理。
小结
在Seata AT模式当中,一阶段以及二阶段的提交和回滚均由框架自动完成,开发人员只需要关注业务SQL即可,所以说AT模式是一种无侵入的分布式事务解决方案。