7

次のクエリが MySQL 5.1 の INNODB テーブルで実行された場合、db が内部的に更新する各行 (合計で 5000) に対して WRITE LOCK を作成するか、バッチ内のすべての行をロックするかは、(MySQL のドキュメントを読んでも) 私にはわかりません。データベースの負荷が非常に高いため、これは非常に重要です。

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操作です。つまり、行の 1 つが失敗した場合 (たとえば、一意の制約が原因で)、5000 行のいずれも更新されません。これは、トランザクション データベースの ACID プロパティの 1 つです。

このため、UPDATEトランザクション全体のすべての行でロックを保持します。それ以外の場合、別のトランザクションは、現在の値に基づいて行の値をさらに更新できます (更新レコード セット値 = 値 * '2' としましょう)。このステートメントは、最初のトランザクションがコミットするかロールバックするかによって、異なる結果を生成するはずです。このため、最初のトランザクションが 5000 回の更新をすべて完了するまで待機する必要があります。

ロックを解除したい場合は、(より小さい) バッチで更新を行ってください。

PSautocommitは、各ステートメントが独自のトランザクションで発行されるかどうかを制御しますが、単一のクエリの実行には影響しません

于 2013-06-12T07:56:28.173 に答える