事务si和ssi隔离级别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了事务si和ssi隔离级别相关的知识,希望对你有一定的参考价值。

参考技术A 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

以上是关于事务si和ssi隔离级别的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL事务隔离级别

精通Java事务编程-可串行化隔离级别之可串行化的快照隔离

分布式数据库tidb-隔离级别详解

Spring 事务类型与隔离级别

mysql 的事务隔离级别 及各个隔离级别应用场景,详细

如何更改mysql事务隔离级别