Mysql行ロック、ギャップロック、next-keyロックの詳細

4440 ワード

一、基本概念
InnoDBはいくつかの異なるロー・ロックをサポートし、MyISAMはテーブル・ロック・ロー・ロック(Record Lock)のみをサポートします.インデックス・レコードにロックを追加します.ギャップロック(Gap Lock):ロックは存在しない空き領域に加えられ、2つのインデックスレコードの間でも、最初のインデックスレコードの前または最後のインデックスの後でもよい.next-keyロック:行ロックとギャップロックを組み合わせます.
注意:検索条件がインデックスでない場合は、テーブル全体がスキャンされ、テーブルロックであり、ローロックではありません.
二、隙間ロック
ギャップロックの場合、存在しない空き領域をロックするとは何か、例を挙げると、1つのテーブルにidが1,2,3,5,6,9行のデータがあり、以下のsql文を実行します.
select * from  people where id > 3 AND id <7 for update;

これは範囲検索であり,InnoDBはidが5と6の2行のデータをロックするだけでなく,idが4(その行は存在しないが)の記録をロックする.
ギャップロックの目的は、(1)ギャップ内に新たなデータが挿入されることを防止する(2)既存のデータを防止し、ギャップ内のデータに更新する
クリアランスロックがロックされている領域は検索条件に従って左に左区間A,右に右区間Bを見つけると,A-Bの範囲がクリアランスとなり,このクリアランスにロックが付加される.
innodbがギャップロックを自動的に使用する条件:(1)Repeatable Readレベルで取得する必要がある(2)取得条件に通常のインデックスが必要である(インデックスがなければmysqlはテーブル全体をスキャンし、それによってテーブル全体のすべてのレコードがロックされ、存在しないレコードが含まれ、この場合他のトランザクションは修正できず削除できず追加できない)
注:通常のインデックスには、プライマリ・キー・インデックスとユニーク・インデックスは含まれません.この2つのインデックスの下でロー・ロックのみが使用されている場合は、具体的な原因を考えてみましょう...例:テーブルpeopleについて
mysql> select * from people ;
+----+-------+
| id | name  |
+----+-------+
|  1 | JAMES |
|  2 | OVEN  |
|  3 | LOVE  |
+----+-------+

じかんじゅんじょ
session A
session B
1
Begin;
2
Begin;
3
select * from people where name=“OVEN” for update ;(「OVEN」に問い合わせる)
4
update people set name=“zph” where id=1; (この操作はロックされます)
nameインデックスでselect…for updateを実行すると(1,“JAMES”)~(3,“LOVE”)までのデータがロックされるので、ステップ4はロックされます.
ただしidプライマリ・キー・インデックスで取得すると
じかんじゅんじょ
session A
session B
1
Begin;
2
Begin;
3
select * from people where id=2 for update ;(「OVEN」に問い合わせる)
4
update people set name=“zph” where id=1; (この操作は実行されます)
ギャップロックの多くの例についてMysqlのいくつかの行ロック(ギャップロック、next-keyロック)が見られる.
このブログの画像が表示されないので、次のurlでアクセスできます.https://img-blog.csdnimg.cn/20200524231954401.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NzUxMzIw,size_16,color_FFFFFF,t_70
二、スナップショットの読み取りと現在の読み取り
スナップショット読み取り:MVCCにより実現され、innodbの繰り返し読み取りを保証するだけでなく、幻読みを防止することができる.しかし、彼が読み取ったデータは一致しているが、データは履歴データである.
簡単なselect操作(select...lock in share mode,select...for updateを除く)
現在の読み取り:データが一致することを保証し、同時に読み込まれたデータが最新のデータであることを保証します.innodbはnext−key lock、すなわちgapロックと行ロックを組み合わせて実現する.
select … lock in share mode
select … for update
insert
update
delete
リファレンス
Mysqlのロックメカニズム
Mysqlのいくつかの行ロック(ギャップロック、next-keyロック)
mySQLデータベースギャップロック(mysqlは幻読みをどのように解決するか)