什么是snapshot isolation

 数据库常见的4种事务隔离级别:

 

 

 (源自:(34条消息) 8. 事务隔离级别: 总结_oyw5201314ck的博客-CSDN博客_ck事务隔离

 

大多数的数据库默认的事务隔离级别是Repeatable-Read或Read-Committed。

 

 

关于数据库的事务隔离级别有两个博主的博客写的比较容易懂,给出如下:

第一个博主:

 

1.  事务隔离级别之Read Uncommitted

2. 事务隔离级别之Read Committed

3. 事务隔离级别之Repeatable Read

4. 事务隔离级别之Serializable

 

第二个博主:

1. Read Uncommitted

3. Repeatable Read

4. Serializable

 

这里也对这四种事务隔离级别说下个人的理解。总的说下,这四种级别其实都是针对多事务并行时的读操作的。

read uncommited是指一个事务在读某个数据时该数据已被另一个事务更新过,但是另一个事务还没有提交,此时该事务读取的值为另一个事务更新后的值,如果此时另一个事务回滚的话,那么这个事务读取到的数据变为脏数据;

read commited是指一个事务在读某个数据时这个数据可能被另一个事务更新过并已提交,那么在这个事务的多次查询中可以读取到的不同数值的该数据,因此不可避免重复读;

repeatable read是指一个事务在读某个数据时不受其他事务对这个数据的更新的影响,但是如果某数据不存在而其他事务插入了某数据,那么在这个事务中也是可以查询到这个数值的,而且事务本身对某个数据的插入和更新也是可以被被本事务所查询到的,尤其要注意由于repeatable read级别的事务隔离一般都是使用snapshot isolation方式来实现的,因此很多地方把repeatable read叫做snapshot isolation,repeatable read可以避免重复读但是无法避免幻读;

serializable可以看做是串行方式运行事务的,一个事务运行结束才可以运行其他事务,该种串行方式可以避免脏读、重复读、幻读。

 

解释一下脏读、重复读、幻读的个人理解:

脏读是指一个事务读到的数据是错误的,不是数据库中真正存在的数值,因为读到的数值被其他事务回滚,因此该数据是错误的。正如read uncommited级别无法避免脏读一样,脏读的原因就是一个事务可以读取到另一个事务还没有提交的数据。

重复读是指一个事务重复的多次读同一个数据会获得不同的数值,其产生的原因和read commited级别一样,是因为一个事务会读取到另一个事务提交的数值,或者说一个事务对某个数据的查询会受其他事务的提交所影响。

幻读是指一个事务多次查询某个数据时会读取到其他事务插入的数据。repeatable read虽然可以保证一个事务多次读取一个存在的数据时会获得相同结果,但是不能保证多次查询的结果会因为读到之前不存在的数据行(被其他事务插入的)而不同。

 

脏读(dirty reads)是指读到了错误的数据。

不可重复读, 也即一个事务范围内两个相同的查询却返回了不同数据。

幻读,也即在一次事务范围内多次进行查询,如果其他并发事务中途插入了新的记录,那么之后的查询会读取到这些“幻影”行。不可重复读对应的是修改即Update,幻读对应的是插入即Insert。

隔离级别为Serializable时,其执行事务时会阻塞其他并发事务,从上面的错误信息中我们也可以看出应该是通过某种锁来实现的。既然是这样,那么“脏读”、“不可重复读”和“幻读”自然是不可能发生了。

(源自:

1.  事务隔离级别之Read Uncommitted

2. 事务隔离级别之Read Committed

3. 事务隔离级别之Repeatable Read

4. 事务隔离级别之Serializable

 
 

=====================================

 
 
关于Snapshot Islation的实现原理,见:
隔离级别--read committed and snapshot isolation - 知乎 (zhihu.com)
 
其中给出了解释:
Snapshot isolation,即每个事务从数据库的快照读取数据,事务可以看到在此事务开始前提交的所有数据,即便某些数据之后被修改了,每个事务只读取修改前的旧的数据版本。
 
 

上面虽然给出了四种事务隔离的级别,但都是关于读的问题,而事务并行写时往往会有 Lost Updates 和 Write Skew 问题。隔离级别--read committed and snapshot isolation - 知乎 (zhihu.com)对这两个问题解释的不是很形象,于是结合一下(34条消息) 写偏斜(Write Skew)和丢失更新(Lost Updates)区别_软件工程小施同学的博客-CSDN博客会更加清晰。

可以说lost updates是指多个事务对某个数据进行先读后写的操作时存在后提交的事务覆盖掉先提交的事务对该数据的修改,导致先提交的事务进行的update丢失;write skew是指事务A读取某数据XXX,然后根据XXX计算出数据YYY的数值,但是在YYY数值写入数据库之前(也就是在事务A进行commit之前),事务B对数据XXX进行了修改并完成提交(执行了commit操作),这样所造成的不一致性叫做write skew。

 

 

 

=====================================

 

 

参考:

隔离级别--read committed and snapshot isolation - 知乎 (zhihu.com)

(34条消息) 写偏斜(Write Skew)和丢失更新(Lost Updates)区别_软件工程小施同学的博客-CSDN博客

 

posted on 2023-01-31 00:16  Angry_Panda  阅读(302)  评论(0)    收藏  举报

导航