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

时间:2013-06-11 20:37:19

标签: 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`

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

1 个答案:

答案 0 :(得分:4)

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

因此,UPDATE会锁定整个事务的所有行。否则,另一个交易可以根据它的当前值进一步更新行的值(假设更新记录设置值=值*' 2')。根据第一个事务是提交还是回滚,此语句应产生不同的结果。因此,它应该等待第一笔交易完成所有5000次更新。

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

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