MySQL のロックの種類
ロックの範囲に応じて、MySQL はグローバル ロック、テーブル レベル ロック、行ロックなどに分類できます。
1. グローバルロック
使用シナリオ:
全库的逻辑备份
読み取りロック付きテーブルのフラッシュ (FTWRL) コマンドを使用して、グローバル読み取りロックを追加し、データベース全体のデータをバックアップできます。
つまり、ロック期間中、ライブラリ全体は外部に対して読み取り専用になりますが、読み取りと書き込みの分離と 1 つのマスター、複数のスレーブのアーキテクチャでは、次の問題が発生する可能性があります。
- メイン データベースのバックアップの場合、アーキテクチャ全体が外部更新操作を処理できず、システム全体が外部ビジネスの処理を停止します。
- スレーブ データベースのバックアップの場合、マスターとスレーブの整合性を確保するために、スレーブ データベースは binlog ログを定期的に更新する必要がありますが、読み取り専用の場合は binlog が実行できず、マスターとスレーブのデータの不整合が発生します。
MySQL 独自のバックアップ ツール mysqldump。その場合mysqldump使用了–single-transaction参数
、読み取りビューを取得するためにバックアップ前にトランザクションが開始されます。サポートされているためMVCC
、バックアッププロセスが更新され、上記の問題は発生しません。
では、FTWRLの意義は何でしょうか?
MySQL の MyISAM ストレージ エンジンはトランザクションをサポートしていないため、MVCC メカニズムはなく、FTWRL ロックを通じてのみバックアップの一貫性を確保できます。
では、なぜset global readonly=trueを使用できないのでしょうか? ライブラリ全体が外部に対して読み取り専用になるようにするには?
- 通常、ライブラリがマスター ライブラリであるかスレーブ ライブラリであるかをマークするために readonly を使用するため、これを使用することはお勧めできません。
- 例外メカニズム。クライアントで例外が発生すると、MySQL は自動的にグローバル ロックを解放します。グローバル読み取り専用を使用すると、クライアントで問題が発生した場合、ライブラリ全体が読み取り専用状態のままになり、システム全体に問題が発生します。
テーブルレベルのロック
テーブルレベルのロックは、テーブル ロックとメタデータ ロックに分類されます。
表锁
一般に、ロック テーブル...読み取り/書き込みを使用して、特定のテーブルに読み取りまたは書き込みロックを追加し、現在のスレッドの実行中に他のスレッドからの干渉が確実に回避されるようにします。
元数据锁(MDL)
テーブルにアクセスすると、読み取りと書き込みの正確性を確保するためにテーブルが自動的に追加されます。つまり、追加、削除、変更、チェックのプロセス中に、他のスレッドがテーブル構造を変更するのを防ぎます。
通常、追加、削除、変更、およびクエリを実行すると、 MDL 読み取りロックがテーブルに追加され、テーブル構造が変更されるとMDL 書き込みロックが追加されます。
MDL の読み取りは相互に排他的ではありませんが、読み取りと書き込みは相互に排他的です。
したがって尽量避免使用长事务
、テーブル構造を変更するときに追加、削除、変更、およびクエリ操作がロックされ、システムがクラッシュすることを避けるために、MDL 書き込みロックがブロックされます。
行ロック
MySQL の行ロックはストレージ エンジン自体によって実装されるため、すべてのストレージ エンジンが行ロックをサポートしているわけではありません。たとえば、MyISAM はテーブル ロックのみを使用でき、これは同時実行性に大きく影響します。
在需要的时候加
ただし、InnoDB トランザクションでは行ロックは行われます并不是不需要时就释放,需要等到事务结束以后才会释放
。
行ロックはテーブルの同時実行性を向上させることができますが、デッドロックの問題を引き起こす可能性があるため、一般にトランザクションでは、同時実行性の競合を引き起こす可能性のある行ロックをトランザクションの最後に配置して、ロックの保持時間を短縮します。
要約:
MySQL の場合、追加することでグローバルロックライブラリ全体 (mysqldump ツール) をバックアップするには、ストレージ エンジンがトランザクションをサポートしている場合、-single-transaction パラメーターを使用して、バックアップ プロセス中に更新操作 (MVCC、整合性ビュー) を確実に実行できるようにすることができます。トランザクションがサポートされていない場合は、FTWRL を使用できます。
通常の状況では、行レベルのロックを使用してテーブル全体に同時実行性を提供できます。行ロックはトランザクションの終了時に解放されます。
最後に、テーブル レベル ロック (MDL) を使用する場合は、テーブル構造への更新がシステム全体の追加、削除、変更、およびクエリ操作をブロックしないようにする必要があります。MDL はトランザクションがコミットされた後に解放されます。