我首先问一个简单的问题:
根据维基百科和Msdn中的脏读定义:
我们有两个并发事务,T1和T2
当T1正在更新一行,而T2正在读取T1“尚未提交”的行时,就会发生脏读。
但在Read提交级别,共享锁在读取数据后立即释放(而不是在事务结束时甚至在语句结束时)。
那么Read提交如何防止脏读呢?Bkaz一旦发布在更新行上的共享锁,T2就可以读取更新的行,而t1可以回滚整个操作,那么我们就可以在t1上进行脏读取了。
发布于 2012-03-15 12:33:04
它阻止脏读取,因为T1在行上有一个锁,因此T2无法读取“尚未提交”行,该行稍后可能会被回滚。
提交的问题试图解决的问题是:
T1创建一个事务并编写一些东西
T2读到
T1回滚事务
现在,T2有一个从未真正存在过的数据。
根据DB的结构方式,有两种“好的”可能性:
T1创建一个事务并编写一些东西
T2等待T1结束事务
或
T2读取DB在T1开始事务之前的“快照”(它称为使用行版本控制提交读取)
( MSSQL的默认选项是第一个选项)
例如,这里比较了各种隔离级别:http://msdn.microsoft.com/en-us/library/ms345124(SQL.90).aspx (在Server 2005中提供的隔离级别下读取)
发布于 2012-03-15 12:38:50
当Server在读提交的隔离级别上执行语句时,它将逐行获取短暂的共享锁。这些共享锁的持续时间仅够长,足以读取和处理每一行;服务器通常在进入下一行之前释放每个锁。因此,如果在read下运行一个简单的select语句并检查锁(例如,使用sys.dm_tran_locks),通常一次最多只看到一个行锁。这些锁的唯一目的是确保语句只读取和返回提交的数据。锁起作用是因为更新总是获得一个排他锁,该锁阻止任何试图获取共享锁的阅读器。
从这里上撕下来
https://stackoverflow.com/questions/9719688
复制相似问题