テーブルのロック (書き込み) を使用する必要があり、それと同時にいくつかのテーブルを更新する必要があるため、ロックはトランザクションセーフではないため、同時にトランザクションが必要です。
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 がテーブル ロックを解放するには、UNLOCK 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を使用しています。
ありがとう