【问题标题】:Confusion about MySQL locks relating to their documentation对与其文档相关的 MySQL 锁感到困惑
【发布时间】:2018-01-02 19:13:30
【问题描述】:

MYSQL locking docs告诉我一个声明

SELECT * FROM child WHERE id = 100;

如果 id 是非唯一或非索引行,将导致进行间隙锁定。但是,这是一致的非锁定选择语句的语法。我认为这些语句使用了自己的快照并避免了锁定。前面的间隙锁是否只适用于查询时?我哪里错了?

【问题讨论】:

    标签: mysql sql locks


    【解决方案1】:

    您理解正确,非锁定 SELECT 不会创建锁,也不会创建任何间隙锁。

    这个例子是错误的,或者充其量是不清楚的。

    锁定 SELECT 包括 LOCK IN SHARE MODE(用于创建 S 锁)或 FOR UPDATE(用于创建 X 锁)。因为有两种可能的锁定子句,也许作者打算写一些东西说任何一个都会导致间隙锁,但后来他们忘记了。

    在 Gap Locks 部分的开头,文本确实使用了示例语句 SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE;,这更清楚地是锁定 SELECT 的示例。

    【讨论】:

    • 或者开启了可序列化的隔离模式,把每一个select变成for update一个。
    • @Shadow 是的,这是真的,但我们正在谈论的文档页面上没有描述。
    • @BillKarwin 我知道不是,但我认为应该是。再添加一项来支持您对文档不够清楚的观点。
    • @BillKarwin 如果你能看看这个问题(不是我的,只是一个有趣的问题),我将不胜感激:stackoverflow.com/questions/48068213/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    相关资源
    最近更新 更多