此查询中的哪些行锁定?
select max(id) from table where id like '9%' for update
如果另一个用户运行此查询会发生什么?
这是相关的问题。
如果您在 id 上没有索引,这将锁定所有记录。但我猜你有这样的索引。所以这将锁定所有匹配的记录,包括介于两者之间的一些记录(如果您锁定 3 和 5,则 4 也被锁定)
SELECT ... FOR UPDATE 读取最新的可用数据,在它读取的每一行上设置排他锁。因此,它设置了与搜索的 SQL UPDATE 将在行上设置的锁相同的锁。
编辑 在 SELECT max(id) FROM ... 的情况下,您不需要从表中读取任何行,因为可以从索引中获取此信息。如果你想锁定一行,正确的查询是 SELECT * FROM table WHERE id = SELECT max(id) FROM table
我会做出有根据的猜测,这取决于事务隔离级别。