我无法理解为什么会发生这种情况。我非常肯定我理解这个理论,但是其他一些事情必须继续,我看不到。
表A具有以下架构:
ID [Primary Key]
Name
Type [Foreign Key]
SprocA将隔离级别设置为可重复读取,并从表A中选择具有Type=1
的行。它还会更新这些行。
SprocB从表A中选择具有Type=2
的行。
现在假设这些是完全不同的行集,如果我同时执行两个行(并调用WAITFOR
调用以减慢它),SprocB直到SprocA才会完成。
我知道它与Type上的查询有关,就像我根据主ID选择那样它允许并发访问表。
是谁放弃了任何光明?干杯
答案 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完成,它将无法正常工作。
执行范围锁定/批量更改时保持并发性很难。