-4

新しい行が挿入されるまでクエリをブロック (待機) する方法はありますか?

4

1 に答える 1

1

この質問を提起する原因となることがわかる2つのケースがあります。

  1. 大規模なバッチINSERTステートメント、つまり:

    INSERT INTO mytable (id, name, date) VALUES
      (1, 'Tom', '2013-01-31'),
      (2, 'Dick', '2013-02-28'),
      (3, 'Harry', '2013-03-31'),
      ...
    

    この場合、MySQL は内部的にロックを行うため、何もする必要はありません。「mytable」の使用を必要とするクエリは、挿入が完了するまで延期されます。

  2. 繰り返しの単一INSERTステートメント、つまり:

    INSERT INTO mytable (id, name, date) VALUES (1, 'Tom', '2013-01-31');
    INSERT INTO mytable (id, name, date) VALUES (2, 'Dick', '2013-02-28');
    INSERT INTO mytable (id, name, date) VALUES (3, 'Harry', '2013-03-31');
    ...
    

    この場合、テーブルはステートメント間でロック解除されテーブルを適切に「ロック」する唯一の方法はトランザクションを使用することです。[注: myISAM はトランザクションをサポートしていません。InnoDB または BDB テーブルを使用する必要があります。すなわち:

    START TRANSACTION;
    INSERT INTO mytable (id, name, date) VALUES (1, 'Tom', '2013-01-31');
    INSERT INTO mytable (id, name, date) VALUES (2, 'Dick', '2013-02-28');
    INSERT INTO mytable (id, name, date) VALUES (3, 'Harry', '2013-03-31');
    ...
    COMMIT;
    
于 2013-05-28T19:15:09.990 に答える