我有点难以区分SNAPSHOT和SNAPSHOT READ COMMITTED的区别。READ COMMITTED是并发的悲观方法,这如何应用于乐观并发?在此情况下,使用SNAPSHOT隔离级别。非常感谢您的帮助和建议。
这两个名字都非常误导。
在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则使用阻塞语义,强制阻断并发进程对已更改(或读取)的资源进行访问,直到第一个事务完成。
我认为并发和事务隔离本身就很难理解,将其与乐观/悲观的隐喻混合使用几乎总是更加难以理解。
读已提交
这是默认的隔离级别。使用共享读锁实现。
读已提交快照
与读已提交相同的隔离级别,但使用行版本控制/MVCC实现。优点是写入者不会阻塞读取者。有些人认为这应该是默认设置。请注意,在某种意义上,它是避免相同异常情况的相同隔离级别。
快照
更强的隔离级别,允许更少的异常情况。