Read Committed Isolation Level如何防止脏读取



我从一个简单的问题开始:

根据中的"脏读"定义维基百科和Msdn:

我们有两个并发事务,T1和T2

当T1正在更新一行,而T2正在读取T1 "尚未提交"的行时,发生脏读取

但是在读取提交级别,一旦读取数据,共享锁就会被释放(而不是在事务结束时,甚至在语句结束时

那么提交读取如何防止脏读取?Bkaz一旦在更新的行T2上释放的共享锁可以读取更新的行,并且t1可以回滚整个操作,那么我们就有了t1 的脏读取

它防止脏读取,因为T1对行有锁,所以T2不能读取稍后可以回滚的"尚未提交"行。

Read Committed试图解决的问题是:

T1创建事务并写入

T2读取到某种

T1回滚事务

现在T2有一个以前根本不存在的数据。

根据数据库的结构,有两种"好"的可能性:

T1创建事务并写入

T2等待T1结束事务

T2读取数据库在T1开始事务之前的"快照"(称为使用行版本控制的读取提交)

(MSSQL上的默认值是第一个选项)

例如,这里有各种隔离级别的比较:http://msdn.microsoft.com/en-us/library/ms345124(SQL.90).aspx(在SQLServer2005中提供的隔离级别下阅读)

当SQL Server在读提交隔离级别执行语句时,它会逐行获取短期共享锁。这些共享锁的持续时间刚好足够读取和处理每一行;服务器通常在进入下一行之前释放每个锁。因此,如果在read-committed下运行一个简单的select语句并检查锁(例如,使用sys.dm_tran_locks),通常一次最多只能看到一个单行锁。这些锁的唯一目的是确保语句只读取和返回提交的数据。锁之所以有效,是因为更新总是获取独占锁,从而阻止任何试图获取共享锁的读取器

从这里撕裂

最新更新