MySQL基本コンセプト-ロック(コンセプト)

2987 ワード

MySQLパフォーマンスの最適化-ロック
MySQL基本コンセプト-ロック
MySQLロックメカニズムの理解を紹介します
基本概念から始めます.
共有ロック
共有ロックのニックネームはSで、Shareの略で、共有ロックのロック粒度は行またはメタグループ(複数行)です.1つのトランザクションが共有ロックを取得した後、ロック範囲内のデータに対して読み取り操作を実行できます.
排他ロック
排他ロックのニックネームはXで、eXclusiveの略で、排他ロックの粒度は共有ロックと同じであり、行またはメタグループでもある.1つのトランザクションが排他ロックを取得した後、ロック範囲内のデータに対して書き込み操作を実行できます.
2つのトランザクションt 1およびt 2があると仮定する
トランザクションt 1がメタグループの共有ロックを取得した場合、トランザクションt 2は、このメタグループの共有ロックを直ちに取得することもできるが、このメタグループの排他的ロックを直ちに取得することはできない(t 1が共有ロックを解放するまで待たなければならない).
トランザクションt 1がメタグループの排他ロックを取得した場合、トランザクションt 2は直ちにこのメタグループの共有ロックを取得することができず、直ちにこのメタグループの排他ロックを取得することもできない(t 1が排他ロックを解放するまで待たなければならない).
意向ロック
意向ロックは表ロックであり、ロックの粒度は表全体であり、意向共有ロック(IS)と意向排他ロック(IX)の2種類に分けられる.意向共有ロックは、トランザクションがデータ上の共有ロックまたは排他ロックを意図していることを示します.「気がある」という言葉の意味は微妙で、はっきり言っているのは事務がやりたいが、まだ本当にやっていないことを意味します.たとえば、トランザクションtがselect * from table lock in share modelを実行し、この文が正常に実行されると、テーブルtableに意向共有ロックが実行されるなど、意向共有ロックを例示する.lock in share modelとは、トランザクションt 1が次に実行する文でSロックを取得することである.t 1のselect * from table lock in share modelが正常に実行されると、次のt 1は、共有ロックを必要とする文だけをスムーズに実行することができるはずである.意向排他ロックの意味は同様であるが,前例では意向排他ロックを取得するにはselect * from table for update****を用いることができる.
lock in share modelとfor updateの2つのものはデータ率理論に悲観ロックという学名があり、悲観ロックに対して楽観ロックもある.様々な鍵がペアで現れているのが見えます.悲観的ロックと楽観的ロックについてはしばらく表に出さないが,後述する.
ロックの反発と互換性
ロックとロックの関係は、互換性があるか、反発しているかのいずれかです.
ロックaとロックbが適合するとは、同じデータのセットを操作する場合、トランザクションt 1がロックaを取得した場合、別のトランザクションt 2がロックbを取得することもできる.
ロックaとロックbの反発とは、同じデータのセットを操作すると、トランザクションt 1がロックaを取得した場合、別のトランザクションt 2がt 1がロックaを解放するまでロックbを取得できないことを意味する.
上記の共有ロック、排他ロック、意向共有ロック、意向排他ロックは互いに以前は互換性/反発関係があり、1つの互換性マトリクスで表すことができる(yは互換性を表し、nは互換性を表す):
   X    S    IX    IS
X  n     n    n     n
S  n     y    n     y
IX n     n    y     y
IS n     y    y     y  

互換性マトリクスはなぜこのようなものですか?
XとSの相互関係は上記で説明したように、IXとISの相互関係はすべて互換性であり、これもよく理解されている.それらはすべて「意図的」であり、YY段階にあり、本当にやっていないので、互換性があるからだ.
残りはXとIX,XとIS,SとIX,SとISの関係であり,XとSの関係からこの4つの関係を導くことができる.
簡単に言えば、XとIXの=XとXの関係です.どうしてですか.トランザクションはIXロックを取得した後、次にXロックを取得する権利があるからです.XとIXが互換性があると、両方のトランザクションがXロックを取得する場合があります.これは、既知のXとXの反発と矛盾しているため、XとIXは反発関係にすぎません.残りの3組の関係は同じで,同じ方法で導くことができる.
UPDATE、DELETE、INSERT文の場合、InnoDBはデータセットに関連する排他ロック(X)を自動的に追加します.通常のSELECT文では、InnoDBにロックはありません.トランザクションは、レコードセットに共有ロックまたは排他ロックを明示的に追加できます.
その他:
コンシステンシ非ブロッキングリード
select...lock in share modeとselect...for updateの違い
インデックスレコードロック
ギャツプロック
バックコードロック
様々な文に対応するロックのタイプ
インデックスがある場合は後符号ロックに基づく行レベルロック、固定インデックスキー検索の場合はインデックスレコードロック、利用可能なインデックスがない場合はテーブルロックに上昇
インデックスがある場合:
select...from整合性非ブロック読み、ロックなし.serializable独立性レベルの例外では、この独立性レベルでポストコードロックを共有します.
select...from...lock in share mode共有後コードロック
select...from...for update列後符号ロック
update...where排他後符号ロック
delete from...where排他後符号ロック
Insert...インデックスレコードロックを並べ、キー値の一意性の競合が発生した場合は共有ロックに移行
Insert...on duplicate key update、ずっと排他ロック
replace...ずっと排他ロック