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操作で、スナップショットの読み取りに属し、ロックされません.
現在の読み取り:特殊な操作、挿入/更新/削除操作、現在の読み取りに属し、ロックが必要です.
以上は、現在の読み取り、レコードの最新バージョンの読み取りです.また、読み出し後、他の同時トランザクションが現在のレコードを変更できないことを保証し、読み出しレコードにロックをかける必要があります.このうち、第1の文に加えて、リードレコードにSロック(共有ロック)を付加するほか、その他の操作には、Xロック(排他ロック)を付加する.
InnoDBとMyISAMの最大の違い
InnoDBには行レベルのロックとトランザクションがあります
同時問題:同じ時刻に読み書きを行い、同時問題はデータの不一致問題を引き起こす.
同時性の問題の解決: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には行レベルのロックとトランザクションがあります