SQL Server隔离级别 - 可重复读取

时间:2009-11-04 18:30:30

标签: sql-server isolation-level

我无法理解为什么会发生这种情况。我非常肯定我理解这个理论,但是其他一些事情必须继续,我看不到。

表A具有以下架构:

ID [Primary Key]
Name
Type [Foreign Key]

SprocA将隔离级别设置为可重复读取,并从表A中选择具有Type=1的行。它还会更新这些行。

SprocB从表A中选择具有Type=2的行。

现在假设这些是完全不同的行集,如果我同时执行两个行(并调用WAITFOR调用以减慢它),SprocB直到SprocA才会完成。

我知道它与Type上的查询有关,就像我根据主ID选择那样它允许并发访问表。

是谁放弃了任何光明?

干杯

3 个答案:

答案 0 :(得分:1)

SQL Server使用索引来执行范围锁定(这是可重复读取经常使用的),所以如果你没有关于Type的索引,它可能会锁定整个表...

答案 1 :(得分:1)

对于隔离级别使用可重复读取集,您将对所有读取的数据保持共享锁,直到事务完成。直到你COMMIT或ROLLBACK。

这将降低应用程序访问此数据的并发性。因此,如果您的第一个过程SELECTS从表调用WAITFOR然后SELECTS再次在事务中,您将保持共享锁的整个时间,直到您提交事务或过程完成。

如果这是您正在使用的测试程序,请在每次选择后添加一个COMMIT,看看是否有助于第二个程序同时运行。

祝你好运!

凯文

答案 2 :(得分:0)

要记住的是,锁定的行是另一个进程的黑盒子。

你知道SprocA只是读取类型= 1而SprocbB只读取类型= 2。

但是,SprocB不知道SprocA会对这些记录做些什么。在事务完成之前,SprocA可能会将所有记录更新为type = 2.在这种情况下,如果SprocB没有等待SprocA完成,它将无法正常工作。

执行范围锁定/批量更改时保持并发性很难。