7

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

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

我希望它是每行的,但由于我不知道如何确保它是这样,所以我决定问一个有更深知识的人。如果不是这种情况并且数据库会锁定集合中的所有行,如果您能解释一下原因,我将不胜感激。

4

1 回答 1

5

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

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

如果要释放锁,只需分批(更小)进行更新。

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

于 2013-06-12T07:56:28.173 回答