5

我已经为一个事务设置了一个可序列化的事务隔离锁。但是我观察到了一些意想不到的结果。

我的查询是

update tabl1 set col2 = 10 where col1 > 10 and col1 < 20

这里 col1 是主键。这里 col1 值为 10,11,12....19,20 的行被锁定以进行更新/插入。在 where 条件下,我给出了 col1>10 和 col1<20 的条件,但 col1=10 和 col1=20 的行仍然被锁定。

如果我给

update tabl1 set col2 = 10 where col1 => 10 and col1 <= 20

然后 col2 的值从 9 到 21 的行被锁定。那么为什么 col1 的 9 和 21 被锁定在这里?

对于下面的查询,全表被锁定。这里 col3 是一个非主列。如果 where 条件中的列不是主键,我不能设置锁定吗?

update tabl1 set col2 = 10 where col3 > 10 and col3 < 20
4

1 回答 1

4

对于键范围锁定,SQL Server 必须使用索引来满足范围条件,因此关于您的最后一个查询,您需要一个索引col3(如果计划不使用它,可能还有查询提示来强制使用它)

此外,它不仅锁定您的WHERE子句中的特定范围。它锁定钥匙。键上的范围锁定保护从该键向下到下一个键的范围,因此将被阻止的确切范围取决于索引中存在哪些键。

更多详细信息/链接在我的回答中

于 2013-01-07T10:33:26.323 回答