MySQLのロックを知っていますか?

2020 ワード

MySQLのロックは、グローバル・ロック、テーブル・レベル・ロック、ロー・ロックに分けられます
グローバルロック
グローバル・ロックとは、データベース・インスタンス全体にロックをかけることを意味し、そのコマンドはFTWRLです.
Flash tables with read lock

このコマンドの意味は、ライブラリ全体を読み取り専用の状態にすることです.このコマンドを使用すると、データの更新、データ構造の定義、更新クラストランザクションのコミットがブロックされます.グローバル・ロックは通常、ライブラリ全体の論理バックアップに使用されますが、ライブラリ全体を読み取り専用にするには、2つの問題があります.
  • プライマリ・ライブラリのバックアップにより、ビジネス全体が停止します.
  • ライブラリからのバックアップは、バックアップ期間中にライブラリから同期されたbin logを実行できず、プライマリ・スレーブが遅延する可能性があります.

  • 公式に持参したロジックはmysqldumpで、データを導く前に、一貫性ビューを取得するためのトランザクションが開きます.MVCC(データのマルチバージョン同時制御)のため、バックアップ中にデータは正常に更新されます.ただし、トランザクションはInnoDBのみがサポートされているため、mysqldumpを使用してデータベースを論理的にバックアップできるのはInnoDBのみです.これも、現在InnoDBが推奨されている理由の一つです.
    テーブルレベルロック
    MySQLの表レベルロックは2種類あります.1つは表ロックで、もう1つはMDLメタデータロックです.(Meta data lock)テーブルロックの構文は、次のとおりです.
    lock tables ...read/write

    テーブル全体に鍵をかけると、他のスレッドの操作だけでなく、本スレッドの操作も制限されます.MDLは暗黙的なロックです.彼の使用は読み書き操作の正確性を保証することであり、MDLはMySQL 5である.5バージョン以降に導入され、1つのテーブルを削除して調べるとMDLリードロックが加算されます.表の構造を変更する場合は、MDL書き込みロックが付加されます.読み書きロック間、書き込みロック間は反発します.(だから書き込みロックは排他ロックとも呼ばれ、読み取りロックは共有ロックとも呼ばれます).ロックは、トランザクションがコミットされたときにのみ解放されます.したがって、長いトランザクションは一貫してロックを占有します.したがって、テーブル構造を変更するときは、ライン上で実行されている追加削除変更操作をブロックしないように注意してください.
    行ロック
    ロー・ロックはストレージ・エンジン・レイヤで実現されるため、MyISAMエンジンの代わりにInnoDBエンジンを使用する理由の一つです.両方のトランザクションが同じホットスポットデータを変更しています.この時、閉塞現象が発生します.InnoDBエンジンでは、ローロックは必要なときに加算されますが、ロックを解除するときは、トランザクションが終了したときに解放されます.したがって、1つのトランザクションが複数のローをロックする場合は、ロックの競合を最も引き起こす可能性のある文を後ろに置くことで、ブロック時間を短縮できます.
    デッドロックとデッドロック検出
    同時システムでは、異なるスレッドにループ依存リソースが発生し、関連するスレッドは他のスレッドがリソースを解放するのを待っており、デッドロックと呼ばれる無限の待機状態になります.デッドロックの問題を解決するには、次の2つの考え方があります.
  • タイムアウト待ちを設定innodb_lock_wait_timeout、デフォルトは50 sで、明らかにこの時間が長すぎますが、この値の大きさは確定しにくく、正常なロック待ちを誤傷します.
  • はデッドロック検出を開始し、デッドロックが発生した後、デッドロックチェーン内のトランザクションをアクティブにロールバックし、他のトランザクションが正常に実行できるようにします.パラメータはinnodb_deadlock_detect

  • しかし、デッドロック検出には追加の負担が必要であり、共有リソースの競合を減らすために同時制御を行うことができます.