繁体   English   中英

可序列化的事务隔离锁

[英]serializable transaction isolation lock

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

我的疑问是

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

这里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

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

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

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

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

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

更多细节/链接在我的答案中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM