1

可能重复:
SELECT ... FOR UPDATE 和 MAX()

此查询中的哪些行锁定?

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

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

是相关的问题。

4

2 回答 2

4

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

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

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

于 2011-07-06T09:40:09.380 回答
2

我会做出有根据的猜测,这取决于事务隔离级别

于 2011-07-06T09:00:15.640 回答