【问题标题】:SELECT FOR UPDATE [duplicate]选择更新 [重复]
【发布时间】:2011-09-29 10:45:14
【问题描述】:

可能重复:
SELECT … FOR UPDATE and MAX()

这个查询锁定了哪些行?

select max(id) from table where id like '9%' for update

如果另一个用户运行此查询会发生什么?

this 是相关问题。

【问题讨论】:

  • 这是我的问题。阅读我的问题的最后一行
  • 是的,我知道。我是从你问题的最后一行找到的。而且我仍然认为你不应该提出多个问同一件事的问题。

标签: mysql innodb select-for-update


【解决方案1】:

我会做出一个有根据的猜测,这取决于transaction isolation level

【讨论】:

    【解决方案2】:

    如果您在 id 上没有索引,这将锁定所有记录。但我猜你有这样的索引。所以这将锁定所有匹配的记录,包括介于两者之间的一些记录(如果您锁定 3 和 5,则 4 也被锁定)

    SELECT ... FOR UPDATE 读取最新的可用数据,在它读取的每一行上设置排他锁。因此,它设置的锁与搜索的 SQL UPDATE 在行上设置的锁相同。

    编辑 在 SELECT max(id) FROM ... 的情况下,您不需要从表中读取任何行,因为可以从索引中获取此信息。如果你想锁定一行,正确的查询是 SELECT * FROM table WHERE id = SELECT max(id) FROM table

    【讨论】:

    • 所以另一个选择 max(id) 进行更新返回什么?
    • select max(id) 只需要读取索引,而不是行,因此这可能不会锁定任何内容,您需要执行 select * where id = select max(id)
    • 这可能不会锁定任何东西? select max() for update 不会锁定行?
    • 是的,这是可能的,我已经解释了原因。它只会读取索引,而不是行。如何锁定未选中的行?
    • 在您的回答中您说“如果您没有 id 索引,这将锁定所有记录”。并在评论中说另一件事。我错了吗?
    猜你喜欢
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 2012-08-30
    • 1970-01-01
    • 2022-01-03
    • 2017-09-10
    • 1970-01-01
    相关资源
    最近更新 更多