-1

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

根据 WikipediaMsdn中的脏读定义:

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

脏读发生在,当 T1 正在更新一行并且 T2 正在读取 T1“尚未提交”的行时

但是在 Read Committed Level 共享锁在数据被读取后立即释放(不是在事务结束时甚至语句结束时)

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

4

2 回答 2

1

它可以防止脏读,因为 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(在 SQL Server 2005 中提供的隔离级别下阅读)

于 2012-03-15T12:33:04.917 回答
0

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

这里撕下来

于 2012-03-15T12:38:50.380 回答