seata at模式

写隔离:

首先记住3条原则。

1.全局锁+本地锁来实现。全局锁由seata管理,本地锁由数据库实现。

2.写操作需要2个锁都获取后才能执行。

3.全局锁的回滚通过undo_log来实现,undo_log中有前后两个版本数据。

下面看一个写回滚的例子。

a事务先写一张表,然后停一段时间,回滚。

b事务在a事务停止的间隔,写同一张表。

这种场景下如果b成功的话,则会出现脏数据。所以seata抑制了b事务的提交操作。如何做到抑制呢,就是通过全局锁来完成的。因为锁一直在a事务,所以b就没有获得提交的机会。

再看a事务。因为a写的表已经完成了提交,当处理后续工作的时候想回滚前面的写操作了。这个依靠数据库本地的机制是无法完成的了。所以seata的做法是再提交一次之前写之前的数据。相当于拿旧数据覆盖了一次,从结果看是没有变化的。而这个旧数据就是在undo_log里记录的。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐