Seata AT模式 回滚为何不会发生脏写

Seata AT模式 回滚为何不会发生脏写

在这里插入图片描述
AT模式下,事务提交需要获取本地锁与全局锁两把锁,也就是说在事务完成之前会一直持有全局锁。回到AT模式为何不会发生脏写的问题:如上图所示,当一个事务开启时先获取本地锁,本地事务提交前需要获取全局锁,本地事务提交后释放本地锁并在全局事务提交前一直持有全局锁!现在考虑以下情况:
tx1:本地事务已提交释放本地锁,全局事务未提交并持有全局锁。
tx2:成功获取本地锁(本地锁也是全局互斥的,不可能与其他事务获取相同本地锁),不能获取全局锁(全局锁被tx1持有)。
tx3: tx3代表其他事务,本地锁与其他锁都无法获取。
此时当tx1回滚时,tx1已经提交需并需要获取本地锁反向补偿,tx2需要全局锁提交本地事务,tx1与tx2都持有对方需要的锁并希望获取对方的锁,造成死锁,最终tx2超时本地事务回滚并释放本地锁,tx1获取本地锁回滚成功。因此先开始的事务先提交,后开始的事务后提交,先开始的事务回滚,后开启的事务必定阻塞在全局锁超时回滚,不会产生脏写。
AT缺点:但数据源情况下并发性低,最多同时存在两个全局事务,因为本地锁与全局锁在数据上互斥。多数据源情况下因刚接触Seata,具体实现原理不清楚,猜测事务会依次获取各数据源本地锁并获取全局锁提交本地事务,但全局锁依然共享,仍然只有一个事务能竞争到拥有全局锁的事务释放的本地锁,依然满足最多存在两个全局事务。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值