用SELECT更新,它会锁定每一行或所有SELECTed记录

ddi*_*hev 6 mysql innodb rowlocking

我不清楚(通过阅读MySQL文档)如果在MySQL 5.1上的INNODB表上运行以下查询,将为内部db更新的每个行创建WRITE LOCK(总共5000个)或锁定批处理中的所有行.由于数据库负载很重,这非常重要.

UPDATE `records`
INNER JOIN (
  SELECT id, name FROM related LIMIT 0, 5000
) AS `j` ON `j`.`id` = `records`.`id` 
SET `name` = `j`.`name`
Run Code Online (Sandbox Code Playgroud)

我希望它是每排,但由于我不知道如何确保它是如此,我决定问一个有更深入了解的人.如果不是这种情况并且db会锁定集合中的所有行,那么如果你给我解释原因,我将感激不尽.

Max*_*sky 5

UPDATE在事务中运行-这是一个atomic操作,这意味着如果该行的一个失败(因为例如独特的约束),它不会更新任何5000行的。这是事务数据库的 ACID 属性之一。

因此,UPDATE对整个事务的所有行都持有锁。否则另一个事务可以进一步更新行的值,基于它的当前值(假设更新记录集值 = 值 * '2')。该语句应该产生不同的结果,具体取决于第一个事务是提交还是回滚。因此,它应该等待第一个事务完成所有 5000 次更新。

如果您想释放锁,只需在(较小的)批次中进行更新。

PSautocommit控制每个语句是否在自己的事务中发出,但不影响单个查询的执行