MySql:表レベルロック、行レベルロック、共有ロック、排他ロック、楽観ロック、悲観ロック

2330 ワード

1.表レベルのロックと行レベルのロック
表レベルのロック:
  • table-level locking、テーブル全体をロックします.
  • はオーバーヘッドが小さく、ロックが速い.
  • はデッドロックしません(必要なすべてのテーブルを一度にロードします).
  • ロック粒度が大きく、ロック衝突が発生する確率が大きく、同時効率が低い.
  • はクエリーに適しています.

  • 行レベルのロック:
  • row-level loking、1行の記録をロックします.
  • はオーバーヘッドが大きく、ロックが遅い.
  • はデッドロックします.
  • ロック粒度は小さく,衝突が発生する確率は小さく,同時効率は高い.
  • は、同時書き込み、トランザクション制御に適しています.
  • は、レコード行のロックを直接失うのではなく、行に対応するインデックスをロックします.
  • sql文がプライマリ・キー・インデックスを操作すると、Mysqlはこのプライマリ・キー・インデックスをロックします.
  • sql文でプライマリ・キー以外のインデックスが操作された場合、MySQLはそのプライマリ・キー以外のインデックスをロックしてから、関連するプライマリ・キー・インデックスをロックします.
  • InnoDBでは、SQL文がインデックスに関連していない場合、非表示のクラスタリングインデックスによってレコードがロックされます.
  • はクラスタインデックスにロックをかけます.実際の効果はテーブルロックと同じです.あるレコードを見つけたら全テーブルをスキャンし、全テーブルをスキャンするには、テーブルをロックしなければなりません.


  • エンジンとロック:
  • MyISAMエンジンは表レベルのロックをサポートし、行レベルのロックはサポートされていません.
  • InnoDBエンジンは、表レベルのロックと行レベルのロックをサポートし、デフォルトは行レベルのロックです.

  • 2.共有ロックと排他ロック
    共有ロック:
  • は、S と呼ばれている.
  • 現在のスレッドは共有リソースに共有ロックをかけており、他のスレッドはこのリソースを読み取ることができ、共有ロックを追加し続けることができるが、このリソースを変更することはできず、排他ロックを追加することはできない.
  • 構文:select id from t_table in share mode;
  • 複数の共有ロックは共存でき、共有ロックと排他ロックは共存できない.

  • 排他ロック:
  • は、X とも呼ばれる.
  • 現在のスレッドは共有リソースに排他ロックをかけ、他のスレッドはこのリソースの読み取りを許可せず、共有ロックの追加を許可せず、このリソースの修正を許可せず、排他ロックの追加を許可しない.
  • 構文:
  • update t_table set a =1;//データベースの削除操作はデフォルトで排他ロック
  • が追加されます.
  • select * from t_table for update;//for updateも1種の添削
  • です
  • 排他ロックは独占的であり、他のロックと共存しない.

  • 3.楽観ロックと悲観ロック
    楽観ロックと悲観ロックは論理的なロックです.
    楽観ロック:
  • 楽観ロック:合併問題は発生しにくいと楽観的に考えている.
  • 楽観ロックは同時問題が発生しにくいと考えられているが、発生しないわけではないので、データの修正のたびにバージョン番号versionが増加することを防止する措置もある.
  • でデータの読み取りを行う場合、ロックをかけるのではなく、現在のバージョン番号version1を同時に読み取る.データを変更する場合は、現在のバージョン番号version2が以前のバージョン番号version1に等しいかどうかを判断します.
  • バージョン番号が一致しない場合は、コンカレントの問題が発生したことを意味するため、今回の操作をロールバックする必要があります.
  • 実現方式:バージョン番号メカニズム、CAS.

  • 悲観ロック:
  • 悲観ロック:合併問題は極めて発生しやすいと悲観的に考えられている.
  • 悲観的なロックは、同時問題が発生しやすいと考えられているため、操作のたびに、読み書きにかかわらず、他のスレッドがデータを修正することを防止するために、記録にロックをかけます.
  • 実装:データベースのロー・ロック、リード・ロック、およびライト・ロック.