事务si和ssi隔离级别

rr隔离级别:有幻读但无写偏虚

si快照隔离级别:有写偏序但无幻读,写偏序问题的规避留给应用避免,应用使用select for update进行强制加写锁,避免被修改

ssi串行快照隔离级别:通过检测rw依赖环的存在,中断其中的一个事务,解决了si存在的写偏序问题


分布式事务的一种实现方式:

1. 事务涉及的任何一行数据需要3个列表示。 存储格式如下:

data列:start_ts -> value

lock列:start_ts -> primary key(由各个列组合而成)

write列:commit_ts -> start_ts  表示真正写入数据的版本

2. 正常操作步骤,全局统一分发时间戳

prepare 阶段:申请start_ts,写data列和lock列

commit 阶段:申请commit_ts,写write列且删lock列

3 冲突检测

写之前检查 lock列是否有锁,有则返回失败

读只需选择write列中小于当前时间的最大commit_ts,然后查找对应的start_ts,再去data列取值

对于读取操作过程中有新的写入提交成功的情况,要么应用select for update强制加写锁,要么读取时加读锁,并且读写互斥

任何事务提交时都先提交primary key行,后提交其他分片的行,提交时primary key行时要检查是否lock列被删除,防止其他新事务已经认为老事务超时发起回滚时与老事务的primary key提交冲突

4 recovery

新事务访问任意分片上的数据时,检测lock列有锁,需要根据primary key找到老事务的primary行,以该行的write列为依据判断老事务是否已经提交成功,如果老事务提交成功则提交冲突分片的老事务行,如果提交失败则回归老事务行;判断规则时在write列上查找commit_ts>=冲突分片lock列的start_ts数据中是否有值为该lock列start_ts,也即是否提交过老事务


参考文档:https://www.cnblogs.com/foxmailed/p/3887430.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容