【问题标题】:serializable transaction isolation lock可序列化事务隔离锁
【发布时间】:2013-01-07 10:22:42
【问题描述】:

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

我的查询是

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

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

如果我给了

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

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

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

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

【问题讨论】:

    标签: sql sql-server serialization transaction-isolation


    【解决方案1】:

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

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

    更多详情/链接是in my answer here

    【讨论】:

    • 但是应该使用哪个索引?集群还是非集群?
    • @wincoding - 只要 SQL Server 使用该索引来解析 WHERE
    猜你喜欢
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    相关资源
    最近更新 更多