MySQL同時制御(ロック使用)

3098 ワード

リード
同時問題:同じ時刻に読み書きを行い、同時問題はデータの不一致問題を引き起こす.
同時性の問題の解決:MySQLはロックメカニズムを採用して同時性の問題を解決する
ロックの分類
MySQLは2つのロックメカニズムを使用して問題を解決します:共有ロックと排他ロック、読み取りロックまたは書き込みロックとも呼ばれます.
  • 共有ロック、リードロック:他の接続の読み取りに影響を与えず、書き込みに影響を与える
  • 排他ロック、書き込みロック:他の接続を読み書きしない

  • MySQLは、異なるデータ粒度に対して、テーブル・ロックとロー・ロックを使用してロックされます.
    ロックの実装
    MySQLはMVCC(Multi-Version Concurrency Control)を使って実現されています(性能はよく、実際にはロックされていません).
  • 悲観ロック(本格ロック)
  • 楽観ロック(いくつかの増加したフィールドによって論理ロックを制御する)

  • MVCCというメカニズムは,1行のデータのいくつかの非表示列を操作することによって実現される.
    B+ツリーのデータ行は、実際には各行にいくつかの非表示列を追加する必要があります(バージョン番号、1つのレコードはいくつかのバージョン番号に対応する可能性がありますが、差は多くありません.このように理解できます.1つのバージョン番号、1つのスナップショットに対応します).
    サービス層およびストレージエンジン層
    サービス・レイヤは、テーブル・ロックを実装しているだけです.
    ロック:lock tableテーブル名read(write)、テーブル名2 read(write)
    ロック解除:unlock tables;
    ストレージ・エンジン・レイヤによるロー・ロック(InnoDBとextraDBのみによるロー・ロック)
    ストレージ・エンジン・レイヤとサーバ・レイヤの両方でロー・ロックが実装されている可能性がありますが、実装ロジックが異なり、ストレージ・エンジン・レイヤの実装が優先されます.
    トランザクション・セクションでは、サーバ・レイヤで実装されたテーブル・ロックではないロー・ロックとテーブル・ロックが暗黙的に追加されます.
    ロー・ロックとテーブル・ロックの比較
    表レベルのロック:オーバーヘッドが小さく、ロックが速い.デッドロックは発生しません.ロック粒度が大きく、ロック競合が発生する確率が最も高く、同時度が最も低い
    行レベルロック:オーバーヘッドが大きく、ロックが遅い.デッドロックが表示されます.ロック粒度が最小で、ロック競合が発生する確率が最も低く、同時性が最大です.
    MVCC同時制御、読み出し操作分類
    MVCC同時制御では、読み出し動作は、スナップショット読み出し(snapshot read)と現在読み出し(current read)の2つに分類される.
    スナップショット読み取り、読み込みされたレコードの可視バージョン(履歴バージョンの可能性があります)は、ロックされません.
    現在の読み取り、読み取りはレコードの最新バージョンであり、現在の読み取りで返されたレコードは、ロックされ、他のトランザクションがこのレコードを同時に変更しないことを保証します.
    スナップショットの読み取り:簡単なselect操作で、スナップショットの読み取りに属し、ロックされません.
    select * from table_name where ?;

    現在の読み取り:特殊な操作、挿入/更新/削除操作、現在の読み取りに属し、ロックが必要です.
    select * from table_name where ? lock in share mode;
    select * from table_name where ? for update;
    insert into table_name values (...);
    update table_name set ? where ?;
    delete from table_name where ?;

    以上は、現在の読み取り、レコードの最新バージョンの読み取りです.また、読み出し後、他の同時トランザクションが現在のレコードを変更できないことを保証し、読み出しレコードにロックをかける必要があります.このうち、第1の文に加えて、リードレコードにSロック(共有ロック)を付加するほか、その他の操作には、Xロック(排他ロック)を付加する.
     
    InnoDBとMyISAMの最大の違い
    InnoDBには行レベルのロックとトランザクションがあります