MySql:表レベルロック、行レベルロック、共有ロック、排他ロック、楽観ロック、悲観ロック
1.表レベルのロックと行レベルのロック
表レベルのロック: table-level locking、テーブル全体をロックします. はオーバーヘッドが小さく、ロックが速い. はデッドロックしません(必要なすべてのテーブルを一度にロードします). ロック粒度が大きく、ロック衝突が発生する確率が大きく、同時効率が低い. はクエリーに適しています.
行レベルのロック: row-level loking、1行の記録をロックします. はオーバーヘッドが大きく、ロックが遅い. はデッドロックします. ロック粒度は小さく,衝突が発生する確率は小さく,同時効率は高い. は、同時書き込み、トランザクション制御に適しています. は、レコード行のロックを直接失うのではなく、行に対応するインデックスをロックします. sql文がプライマリ・キー・インデックスを操作すると、Mysqlはこのプライマリ・キー・インデックスをロックします. sql文でプライマリ・キー以外のインデックスが操作された場合、MySQLはそのプライマリ・キー以外のインデックスをロックしてから、関連するプライマリ・キー・インデックスをロックします. InnoDBでは、SQL文がインデックスに関連していない場合、非表示のクラスタリングインデックスによってレコードがロックされます. はクラスタインデックスにロックをかけます.実際の効果はテーブルロックと同じです.あるレコードを見つけたら全テーブルをスキャンし、全テーブルをスキャンするには、テーブルをロックしなければなりません.
エンジンとロック: MyISAMエンジンは表レベルのロックをサポートし、行レベルのロックはサポートされていません. InnoDBエンジンは、表レベルのロックと行レベルのロックをサポートし、デフォルトは行レベルのロックです.
2.共有ロックと排他ロック
共有ロック:は、 現在のスレッドは共有リソースに共有ロックをかけており、他のスレッドはこのリソースを読み取ることができ、共有ロックを追加し続けることができるが、このリソースを変更することはできず、排他ロックを追加することはできない. 構文: 複数の共有ロックは共存でき、共有ロックと排他ロックは共存できない.
排他ロック:は、 現在のスレッドは共有リソースに排他ロックをかけ、他のスレッドはこのリソースの読み取りを許可せず、共有ロックの追加を許可せず、このリソースの修正を許可せず、排他ロックの追加を許可しない. 構文: が追加されます. です
排他ロックは独占的であり、他のロックと共存しない.
3.楽観ロックと悲観ロック
楽観ロックと悲観ロックは論理的なロックです.
楽観ロック:楽観ロック:合併問題は発生しにくいと楽観的に考えている. 楽観ロックは同時問題が発生しにくいと考えられているが、発生しないわけではないので、データの修正のたびにバージョン番号 でデータの読み取りを行う場合、ロックをかけるのではなく、現在のバージョン番号 バージョン番号が一致しない場合は、コンカレントの問題が発生したことを意味するため、今回の操作をロールバックする必要があります. 実現方式:バージョン番号メカニズム、CAS.
悲観ロック:悲観ロック:合併問題は極めて発生しやすいと悲観的に考えられている. 悲観的なロックは、同時問題が発生しやすいと考えられているため、操作のたびに、読み書きにかかわらず、他のスレッドがデータを修正することを防止するために、記録にロックをかけます. 実装:データベースのロー・ロック、リード・ロック、およびライト・ロック.
表レベルのロック:
行レベルのロック:
エンジンとロック:
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
に等しいかどうかを判断します.悲観ロック: