MySQL テーブルがロックされる理由: 1. トランザクション処理は、すべて実行されるか、まったく実行されない必要がある一連の SQL ステートメントです。トランザクションに同じテーブルを変更する複数の SQL ステートメントが含まれる場合、テーブルロックされます; 2. インデックス操作、テーブルのインデックスを作成または削除するとき、テーブルはロックされます; 3. 同時操作、テーブルに大量のデータを挿入しながらクエリ操作を実行しようとします。ロックされるなどになります。
このチュートリアルのオペレーティング システム: Windows 10 システム、mysql バージョン 8.0、Dell G3 コンピューター。
MySQL は、オープンソースのリレーショナル データベース管理システムであり、最も広く使用されているデータベースの 1 つです。 MySQL を使用していると、テーブルがロックされる状況がよく発生します。テーブルがロックされる理由は数多くありますが、一般的な理由をいくつか紹介します。
1. トランザクション処理
トランザクションとは、完全に実行されるか、まったく実行されない一連の SQL ステートメントを指します。同じ SQL ステートメントを使用してテーブルを変更すると、テーブルはロックされます。これは、MySQL が行ロック メカニズムを使用しているためで、2 つ以上のトランザクションが同時にテーブルを変更すると、MySQL はテーブルのロックが解除されるまで、いずれかのトランザクションの変更リクエストを待機キューに入れます。
2. インデックス操作
テーブルに対してインデックス操作を実行すると、テーブルがロックされます。たとえば、大きなテーブルに対して新しいインデックスを作成したり、インデックスを削除したりすると、その時点でテーブルはロックされます。インデックス操作でテーブルをロックするのにかかる時間は、テーブルのサイズと構造に関係します。
3. 同時操作
MySQL では、同時操作によりテーブルがロックされます。たとえば、大量のデータをテーブルに挿入し、同時にクエリ操作を実行しようとすると、テーブルがロックされます。これは、MySQL では、クエリ ステートメントはクエリ操作を実行する前にテーブルの読み取りロックを取得する必要があり、挿入ステートメントはデータ挿入操作を実行する前にテーブルの書き込みロックを取得する必要があるためです。
4. ロック操作
MySQL では、ロック操作によってテーブルもロックされます。たとえば、SELECT ... FOR UPDATE ステートメントを使用して行レベルのロック操作を実行すると、MySQL は行に書き込みロックを追加し、テーブル全体がロックされます。この時点で、他の操作はロックが解放されるまで待ってから続行する必要があります。
つまり、テーブルのロックは MySQL でよく発生する問題の 1 つです。テーブルのロックを可能な限り回避し、システムの同時実行性を向上させるために、さまざまなロックの種類とその原因を理解する必要があります。
MySQL は、共有ロック (S ロック) や排他的ロック (X ロック) など、複数のタイプのテーブル ロックをサポートしています。共有ロックを使用すると、複数のトランザクションが同時にテーブルにアクセスできますが、データを変更することはできません。排他ロックは、ロックが解放されるまで他のトランザクションがテーブルにアクセスすることを禁止します。
通常、MySQL は次の操作を実行するときにテーブルをロックします:
SELECT ... FOR UPDATE または SELECT ... LOCK IN SHARE MODE ステートメントを使用してデータをクエリするとき。
INSERT、UPDATE、または DELETE ステートメントを使用してデータを変更する場合。
ALTER TABLE ステートメントを使用してテーブル構造を変更する場合。
TRUNCATE TABLE ステートメントを使用してテーブル データをクリアする場合。
さらに、MySQL は手動ロックもサポートしており、GET_LOCK() 関数と RELEASE_LOCK() 関数を使用してテーブル ロックを取得および解放できます。
一般的なテーブル ロック戦略には次のものが含まれます。
行ロック: 行データを変更するときにロックし、特定の行をロックします。
ページロック: ページデータを変更するときにロックし、特定のページをロックします。
テーブルロック: 修理中
以上がMYSQL でテーブルがロックされているのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。