問題タブ [table-locking]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
3144 参照

mysql - テーブルロックを伴うMysqlトランザクション

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

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 から読み取る必要がある場合は、次のようにします。

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

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

ありがとう

0 投票する
0 に答える
152 参照

sql-server - SQL Server での単純なテーブル ロックのパターン

SQL Server で 2 ステップの挿入を実行しているときに、テーブルを排他的にロックするために何をする必要があるかを調べるために、トランザクションの分離レベルとテーブル ヒントに関する MSDN を読んでいます。私はそれを行う2つの方法を思いついたので、アプローチの違いを知りたいです。

この回答は、ヒントを使用してそれを行う方法を示しています ( https://stackoverflow.com/a/23759307/545430 ):

分離レベルを設定することで、目的を達成することもできると思います。

トランザクションがこの新しい行を挿入している間、すべての更新からテーブル全体をロックすることが重要です。両方のアプローチで同じ結果が得られるでしょうか? テーブルは INSERT コマンドと UPDATE コマンドの両方でロックされていますか?