6

テーブルのロック (書き込み) を使用する必要があり、それと同時にいくつかのテーブルを更新する必要があるため、ロックはトランザクションセーフではないため、同時にトランザクションが必要です。

mysqlのドキュメントから、次の https://dev.mysql.com/doc/refman/5.6/en/lock-tables-and-transactions.htmlを読みました

InnoDB テーブルなどのトランザクション テーブルで LOCK TABLES および UNLOCK TABLES を使用する正しい方法は、SET autocommit = 0 (START TRANSACTION ではない) でトランザクションを開始し、その後に LOCK TABLES を続け、トランザクションをコミットするまで UNLOCK TABLES を呼び出さないことです。明示的に。たとえば、テーブル t1 に書き込み、テーブル t2 から読み取る必要がある場合は、次のようにします。

SET autocommit=0;
LOCK TABLES t1 WRITE, t2 READ, ...;
... do something with tables t1 and t2 here ...
COMMIT;
UNLOCK TABLES;

LOCK TABLES を呼び出すと、 InnoDB は内部的に独自のテーブル ロックを取得し、MySQL は独自のテーブル ロックを取得します。InnoDB は次のコミットで内部テーブル ロックを解放しますが、MySQL がテーブル ロックを解放するには、UNLO​​CK TABLES を呼び出す必要があります。autocommit = 1 は使用しないでください。これは、InnoDB が LOCK TABLES の呼び出しの直後に内部テーブル ロックを解放し、デッドロックが非常に簡単に発生する可能性があるためです。古いアプリケーションが不要なデッドロックを回避できるように、autocommit = 1 の場合、 InnoDB は内部テーブル ロックをまったく取得しません。

一方、このページには https://dev.mysql.com/doc/refman/5.6/en/commit.htmlがあります

単一の一連のステートメントに対して自動コミット モードを暗黙的に無効にするには、START TRANSACTION ステートメントを使用します。

START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;

START TRANSACTION を使用すると、COMMIT または ROLLBACK でトランザクションを終了するまで、自動コミットは無効のままになります。その後、自動コミット モードは以前の状態に戻ります。

したがって、 withSTART TRANSACTIONが自動コミットを無効にしている場合、なぜテーブル ロック セクションで正しい方法はto begin a transaction with SET autocommit = 0 (not START TRANSACTION). 私は何かを見逃していますか、それともこれら2つの間に矛盾がありますか? START TRANSACTIONテーブルロックで使用できますか? 私はInnoDBを使用しています。

ありがとう

4

1 に答える 1

3

https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html

  • LOCK TABLES はトランザクションセーフではなく、テーブルをロックしようとする前にアクティブなトランザクションを暗黙的にコミットします。
  • トランザクションを開始すると (たとえば、START TRANSACTION を使用して)、現在のトランザクションが暗黙的にコミットされ、既存のテーブル ロックが解放されます。
于 2016-09-17T20:02:33.443 に答える