分布式事务Seata之AT 模式原理

Seata官网-AT模式介绍

AT 模式是一种对业务无任何侵入的分布式事务解决方案。 

先看官网对于AT模式的介绍:

整体机制

两阶段提交协议的演变:

  • 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。

  • 二阶段:

    • 提交异步化,非常快速地完成。
    • 回滚通过一阶段的回滚日志进行反向补偿。

什么是两段式提交: 

一阶段:coordinator去提议voter1,voter2,voter3执行任务,但是不提交。

二阶段: voter1,voter2,voter3执行后,都没问题,一起提交。有问题,则回滚。          

这样的问题是:二阶段出问题会直接挂掉。  

                         一阶段voter1有问题,voter2,voter3都不可用。 

 那么AT模式如何改良的呢?

两阶段提交协议的演变:

  • 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源

  • 二阶段:

    • 提交异步化,非常快速地完成。
    • 回滚通过一阶段的回滚日志进行反向补偿。

在一阶段,解析 SQL:得到 SQL 的类型(UPDATE),表(product),条件(where name = 'TXC')等相关的信息。

1.根据sql信息得到before image

2.执行业务sql.

3.根据sql信息得到after image

二阶段:执行成功,进行分布式事务提交
业务 SQL在一阶段已经提交至数据库, 所以 Seata 框架只需将一阶段保存的快照数据和行锁删掉,完成数据清理即可。


二阶段:执行失败,进行业务回滚
首先对比“数据库当前业务数据”和 “after image”,

如果当前数据库数据如果和after image不一致,说明数据库已被修改,会提示报错,需人工介入。

如果当前数据库数据如果和after image一致,用“before image”执行update操作还原业务数据,并且删除中间数据。

数据第一阶段就提交,两个事务对于同一个表同一个字段操作时,如何避免脏写呢?

先看大前提:

        1. 有全局锁,本地事务才能提交。

        2.全局提交后,才释放全局锁。

        3.拿全局锁有一定时间,超过时间,就不拿了,

           因为有全局锁,本地事务才能提交。所以拿取超时的只能回滚并且释放本地锁。

例如两个全局事务 tx1 和 tx2,分别对 a 表的 m 字段进行-10操作,m 的初始值 1000。

一阶段:

tx1 先开始,开启本地事务,拿到本地锁,

更新操作 m = 1000 - 100 = 900。

本地事务提交前,先拿到该记录的 全局锁 ,本地提交释放本地锁。

 tx2 后开始,开启本地事务,拿到本地锁,更新操作 m = 900 - 100 = 800。

这时候tx2准备提交本地事务,但是tx1这时候还没有全局提交,tx1在全局提交前,一直持有全局锁,这时tx2一直尝试拿全局锁。

二阶段:

成功:tx1全局提交,释放全局锁;tx2拿到全局锁了,全局提交,释放全局锁。

失败: tx1 的二阶段全局回滚,则 tx1 需要重新获取该数据的本地锁,进行反向补偿的更新操作,实现分支的回滚。 但是,这个时候,tx2还持有本地锁, 导致tx1回滚失败, 等tx2拿全局锁超时了,tx2回滚了,释放了本地锁,tx1才能回滚。

简单说来就是tx1全程拿着全局锁。我tx1不全局提交,你tx2也不能全局提交,tx2拿全局锁超时就回滚,所以就不会有脏写。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Seata是一款开源的分布式事务解决方案,它提供了高性能和简单易用的分布式事务服务。Seata支持AT、TCC、SAGA和XA事务模式,旨在为用户打造一站式的分布式解决方案。AT模式Seata的一种事务模式,它基于支持本地ACID事务的关系型数据库,并通过JDBC访问数据库。在AT模式中,分支的本地事务可以在全局事务的第一阶段提交后立即释放本地事务锁定的资源。与XA事务相比,AT模式通过回滚日志的方式,在第一阶段释放对资源的锁定,降低了锁范围,提高了效率。在第二阶段提交时,Seata的整体执行机制可以大致分为两个阶段:发起方TM向TC申请开启全局事务并生成唯一的全局事务标识XID,RM向TC注册分支事务并与XID绑定,TM向TC发起XID下的所有分支事务的全局提交或回滚请求,TC汇总事务信息并决定最终是提交还是回滚,通知所有RM提交或回滚资源,最终完成分布式事务的提交或回滚。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Seata简单介绍及其原理(一)](https://blog.csdn.net/qq_29860591/article/details/103776602)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [分布式事务Seata原理](https://blog.csdn.net/a745233700/article/details/122402795)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值