webdevqa.jp.net

MySQLエラーコード:1205。内部結合を使用した更新中のロック待機タイムアウト

テーブルTime_Stampsimple_pack_dataフィールドを更新して、temp_dataテーブルの同様のタイトルのフィールドの値と一致させようとしています。各テーブルには、Test_NumberおよびTime_Markerというフィールドがあり、これらをINNER JOINテーブルに使用しています。 Time_Markerは読み取りカウントのようなもので、Time_Stampはテストの開始からの実際の時間です。

Time_Stampを一度に1つのテストで更新したいので、試したコードは次のとおりです。

UPDATE simple_pack_data s
INNER JOIN (
    SELECT *
    FROM temp_data t
    WHERE t.Test = "3"
    ) AS tmp
ON s.Test_Number = tmp.Test_Number AND s.Time_Marker = tmp.Time_Marker
SET s.Time_Stamp = tmp.Time_Stamp
WHERE s.Test_Number = "3";

これを実行すると50秒以上かかり、1205エラーが発生します。同様に構造化されたselectステートメントを実行すると、次のようになります。

SELECT *
FROM simple_pack_data s
INNER JOIN (
    SELECT *
    FROM temp_data t
    WHERE t.Test = "3"
    ) AS tmp
ON s.Test_Number = tmp.Test AND s.Time_Marker = tmp.Time_Marker
WHERE s.Test_Number = "3";

1秒もかからず、joinが正常に機能していることはわかっています。更新には本当に時間がかかりますか?もしそうなら、タイムアウト値を変更してそれを乗り越えることができるようにする方法はありますか?

7
eh_whatever

このエラーは完全にMySQLが正常に動作していないことです。最善の解決策はMySQLを終了することですが、その機能が不足しているため、この パフォーマンスブログ投稿 は過去にこれを回避するのに役立ちました。

MySQLにはこれらの小さな落とし穴がたくさんあります。これはAccessで作業するようなもので、半分の時間、プログラムは間違ったことを実行し、エラーを発生させません。

4
Twelfth