Mysql 使用SELECT更新,它会锁定每一行或所有选定的记录吗

Mysql 使用SELECT更新,它会锁定每一行或所有选定的记录吗,mysql,innodb,rowlocking,Mysql,Innodb,Rowlocking,我不清楚(通过阅读MySQL文档)以下查询是否在MySQL 5.1上的INNODB表上运行,是否会为db内部更新的每一行创建写锁(总共5000行)或锁定批处理中的所有行。由于数据库的负载非常重,这一点非常重要 UPDATE `records` INNER JOIN ( SELECT id, name FROM related LIMIT 0, 5000 ) AS `j` ON `j`.`id` = `records`.`id` SET `name` = `j`.`name` 我希望它是每

我不清楚(通过阅读MySQL文档)以下查询是否在MySQL 5.1上的INNODB表上运行,是否会为db内部更新的每一行创建写锁(总共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将锁定集合中的所有行,如果您能解释原因,我将不胜感激。

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

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

如果您想释放锁,只需(较小)批量更新即可


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

是否使用事务?(自动提交=关闭)?ps:您确定您的查询在语义上是正确的吗?它可能会锁定所有行,因为MySQL就是这样运行的。哦,等等,这取决于表类型,当然:InnoDB应该是“行级别”。我在寻找的是“它实际上是如何工作的”,而不是“它可能是如何工作的”,因为“可能”可能会让我在生产中失败。@Sebas,这是一个查询,我不确定全局设置中的
autocommit=off
是否会影响它内部运行的方式。否则,我在查询中出现了一个错误(因为我没有粘贴它,而是在移动中通过内存写入),并通过编辑更正了它。谢谢