可序列化的事务隔离锁

win*_*ing 5 sql sql-server serialization transaction-isolation

我为事务设置了可序列化的事务隔离锁.但是我正在观察一些不期望的结果.

我的疑问是

update tabl1 set col2 = 10 where col1 > 10 and col1 < 20
Run Code Online (Sandbox Code Playgroud)

这里col1是主键.具有值10,11,12 .... 19,20的col1的行被锁定以进行更新/插入.在条件为i的条件下,col1> 10且col1 <20,但仍然有col1 = 10且col1 = 20的行被锁定.

如果我给

update tabl1 set col2 = 10 where col1 => 10 and col1 <= 20
Run Code Online (Sandbox Code Playgroud)

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

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

update tabl1 set col2 = 10 where col3 > 10 and col3 < 20
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 4

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

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

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