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会锁定集合中的所有行,那么如果你给我解释原因,我将感激不尽.
将UPDATE在事务中运行-这是一个atomic操作,这意味着如果该行的一个失败(因为例如独特的约束),它不会更新任何5000行的。这是事务数据库的 ACID 属性之一。
因此,UPDATE对整个事务的所有行都持有锁。否则另一个事务可以进一步更新行的值,基于它的当前值(假设更新记录集值 = 值 * '2')。该语句应该产生不同的结果,具体取决于第一个事务是提交还是回滚。因此,它应该等待第一个事务完成所有 5000 次更新。
如果您想释放锁,只需在(较小的)批次中进行更新。
PSautocommit控制每个语句是否在自己的事务中发出,但不影响单个查询的执行
| 归档时间: |
|
| 查看次数: |
737 次 |
| 最近记录: |