隔离级别的差异,快照和快照读提交快照?

3
我有点难以区分SNAPSHOT和SNAPSHOT READ COMMITTED的区别。READ COMMITTED是并发的悲观方法,这如何应用于乐观并发?在此情况下,使用SNAPSHOT隔离级别。非常感谢您的帮助和建议。

READ COMMITTED与乐观锁和悲观锁无关,它是一种隔离级别。乐观锁和悲观锁通常反映并发时间,而不是隔离级别。顺便说一下,你的问题包含了两个问题。 - g.pickardou
我听说READ COMMITTED SNAPSHOT是一个快照隔离级别(即乐观并发),它将悲观并发中的READ COMMITTED应用于快照隔离级别,这是真的吗?如果是真的,那么这种情况下,READ COMMITTED SNAPSHOT隔离级别与SNAPSHOT隔离级别有何不同之处,它们各自的区别是什么? - Alfin E. R.
2个回答

3

这两个名字都非常误导。

在SQL Server术语中,SNAPSHOT和SNAPSHOT READ COMMITTED都是隔离级别及实现方式,用于使SQL Server实现并发数据访问的隔离。

主要区别:在SNAPSHOT级别中,防止了可重复读和幻读,而在SNAPSHOT READ COMMITTED级别中,你可能会遇到不可重复读和幻读。

换句话说,SNAPSHOT是比SNAPSHOT READ COMMITTED更高、更强的隔离级别。


关于仅仅隔离级别:SNAPSHOT等价于SERIALIZABLE,而SNAPSHOT READ COMMITTED则等价于READ COMMITTED。然而它们的实现不同。虽然SNAPSHOT和SNAPSHOT READ COMMITTED使用记录版本,但SERIALIZABLE和READ COMMITTED则使用阻塞语义,强制阻断并发进程对已更改(或读取)的资源进行访问,直到第一个事务完成。


我认为并发和事务隔离本身就很难理解,将其与乐观/悲观的隐喻混合使用几乎总是更加难以理解。


Serializable提供比Snapshot更强的保证,它们并不等同。Snapshot不能防止写偏斜。请参见:https://github.com/ept/hermitage - Dmitry

1

读已提交

这是默认的隔离级别。使用共享读锁实现。

读已提交快照

与读已提交相同的隔离级别,但使用行版本控制/MVCC实现。优点是写入者不会阻塞读取者。有些人认为这应该是默认设置。请注意,在某种意义上,它是避免相同异常情况的相同隔离级别。

快照

更强的隔离级别,允许更少的异常情况


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接