我不清楚(通过阅读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会锁定集合中的所有行,那么如果你给我解释原因,我将感激不尽。
答案 0 :(得分:4)
UPDATE
在事务中运行 - 它是一个atomic
操作,这意味着如果其中一行失败(例如因为独特的约束),它就会赢得&#t; t更新5000行中的任何一行。这是事务数据库的ACID属性之一。
因此,UPDATE
会锁定整个事务的所有行。否则,另一个交易可以根据它的当前值进一步更新行的值(假设更新记录设置值=值*' 2')。根据第一个事务是提交还是回滚,此语句应产生不同的结果。因此,它应该等待第一笔交易完成所有5000次更新。
如果要释放锁定,只需在(较小的)批次中进行更新。
P.S。 autocommit
控制是否在自己的事务中发出每个语句,但不影响单个查询的执行