InnoDBの7種類のロック
5742 ワード
「穴を掘って、InnoDBの7種類の錠」はInnoDBの中で、7種類の異なるタイプの錠を使うことを初歩的に説明した.
一、オートロック(Auto-inc Locks)
一、ケーススタディ
MySQL、InnoDB、デフォルトの独立性レベル(RR)、データテーブルがあると仮定します.
t(id AUTO_INCREMENT, name);
データテーブルにデータがあります.
1, shenjian
2, zhangsan
3, lisi
トランザクションAは先に実行され、まだコミットされていません:
insert into t(name) values(xxx);
トランザクションBの実行後:
insert into t(name) values(ooo);
問:事務Bはブロックされませんか.
二、ケーススタディ
InnoDBはRR独立性レベルで、上記の例では、幻読みの問題を解決することができます.
(1)トランザクションAがinsertを先に実行すると、(4,xxx)の記録が得られ、自増列であるため、指定idが4であることを表示する必要がなく、InnoDBは自動的に増加し、トランザクションがコミットされていないことに注意する.
(2)トランザクションBの後にinsertを実行し、ブロックされないと仮定すると、(5,ooo)の記録が得られる.
この時、何の問題もありませんでしたが、もし、
(3)取引Aはinsertを継続する:
insert into t(name) values(xxoo);
(6,xxoo)の記録が得られます.
(4)取引A再select:
select * from t where id>3;
結果は次のとおりです.
4, xxx
6, xxoo
画外音:5のレコードをクエリーすることはできません.RRの独立性レベルでは、トランザクションがコミットされていないデータを読み取ることはできません.
あれ、これは事務Aにとって、おかしいですね、AUTO_INCREMENTの列には、2つの記録が連続して挿入され、1つは4で、次の1つは6になり、わけのわからない幻のようだ.
三、オートロック(Auto-inc Locks)
オートロックは、トランザクションに対してAUTO_を挿入する特殊なテーブル・レベル・ロックです.INCREMENTタイプの列.最も簡単な場合、1つのトランザクションがテーブルにレコードを挿入している場合、最初のトランザクションが挿入されたローが連続するプライマリ・キー値であるように、他のすべてのトランザクションの挿入を待つ必要があります.
画外音:公式サイトでは
An AUTO-INC lock is a special table-level lock taken by transactions inserting into tables with AUTO_INCREMENT columns. In the simplest case, if one transaction is inserting values into the table, any other transactions must wait to do their own inserts into that table, so that rows inserted by the first transaction receive consecutive primary key values.
同時に、InnoDBはinnodb_を提供します.autoinc_lock_mode構成は、ロックのモードと動作を調整および変更することができる.
四、自増列でなければ
上の例では,仮に自増列ではないとしたら,どのような状況になるのだろうか.
t(id unique PK, name);
データテーブルにデータがあります.
10, shenjian
20, zhangsan
30, lisi
トランザクションAは先に実行され、10と20の2つのレコードに1行が挿入され、まだコミットされていません.
insert into t values(11, xxx);
トランザクションBが実行されると、10と20の2つのレコードに1行が挿入されます.
insert into t values(12, ooo);
ここでは、自己ロックは使用されません.
(1)どんな鍵が使われますか.
(2)事務Bがブロックされるのではないでしょうか.
共有/排他ロック、意向ロック、挿入意向ロック.
一、共有/排他ロック(Shared and Exclusive Locks)
『InnoDB同時はなぜこんなに高いのか』一般的な共有/排他ロックについて説明しますが、InnoDBではもちろん標準的な行レベルロック(row-level locking)、共有/排他ロックも実現されています.
(1)トランザクションは、ある行のレコードの共有Sロックを取得してこそ、この行を読み取ることができる.
(2)トランザクションは、ある行の記録のXロックを取得してこそ、この行を修正または削除することができる.
互換性のある反発テーブルは次のとおりです.
MS互換反発
X反発
次のようになります.
(1)複数の事務はSロックを手に入れることができ、読み取りは並行することができる.
(2)Xロックを取得できる事務は1つしかなく、書き込み/読み書きは反発しなければならない.
共有/排他ロックの潜在的な問題は、十分な並列ができず、解決構想はデータのマルチバージョンであり、具体的な構想は「InnoDB同時なぜこんなに高いのか」である.で紹介しましたが、ここはもう深く展開しません.
二、意向ロック(Intention Locks)
InnoDBはマルチパーティクルロック(multiple granularity locking)をサポートし、行レベルロックと表レベルロックの共存を可能にし、実際の応用ではInnoDBは意向ロックを使用している.
意向ロックとは、将来のある時点で、トランザクションが共有/排他ロックを追加する可能性があることを意味し、事前に意向を宣言します.
意向ロックには、次のような特徴があります.
(1)まず、意向ロックは、テーブルレベルのロック(table-level locking)である.
(2)意向ロックは以下のように分けられる.
意向共有ロック(intention shared lock,IS)は、トランザクションがテーブルの一部のローに共有Sロックを追加する意向があることを示しています.
意向排他ロック(intention exclusive lock,IX)は、トランザクションがテーブルの一部のローにXロックを追加する意向があることを示しています.
例を挙げます.
select...lock in share mode、ISロックを設定します;
select...for update、IXロックを設定します;
(3)意向ロックプロトコル(intention locking protocol)は複雑ではない:
トランザクションが特定のローのSロックを取得するには、テーブルのISロックを取得する必要があります.
トランザクションが特定のローのXロックを取得するには、テーブルのIXロックを取得する必要があります.
(4)意向ロックは意向を示すだけであるため,実際には比較的弱いロックであり,意向ロック間では互いに反発するのではなく,並列にすることができ,その互換反発表は以下の通りである.
IS互換性
IX互換性
(5)ええと,意向ロック間が互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに共有ロック/排他ロックと反発します.反発テーブルは次のとおりです.
IS互換反発
IX反発
画外音:排他ロックは強力なロックで、他のタイプのロックと互換性がありません.これもよく理解されています.あるローを修正して削除するときは、データの一貫性を保障するために、強いロックを取得し、そのローの他の同時性を禁止する必要があります.
三、意向ロック(Insert Intention Locks)を挿入する
既存のデータ行の修正と削除には,反発ロックXロックを強化しなければならないが,データの挿入には,反発を実施するためにこのような強いロックを加える必要があるのだろうか.意向錠を挿入し、生み出す.
挿入意向ロックは、insert操作に特化したギャップロック(Gap Locks)の一種である(したがって、インデックスにも実装されている).
画外音:ちょっと気まずいですが、隙間ロックは次の文章で紹介されます.しばらく理解すると、インデックスに実装され、インデックスのある区間範囲をロックするロックです.
その遊び方は:
複数のトランザクションは、同じインデックス、同じ範囲の区間にレコードを挿入するときに、挿入された場所が衝突しない場合、互いにブロックされません.
画外音:公式サイトでは
Insert Intention Lock signals the intent to insert in such a way that multiple transactions inserting into the same index gap need not wait for each other if they are not inserting at the same position within the gap.
これで、前に穴を掘った例を解くことができます.
MySQL、InnoDB、RRの下:
t(id unique PK, name);
データテーブルにデータがあります.
10, shenjian
20, zhangsan
30, lisi
トランザクションAは先に実行され、10と20の2つのレコードに1行が挿入され、まだコミットされていません.
insert into t values(11, xxx);
トランザクションBが実行されると、10と20の2つのレコードに1行が挿入されます.
insert into t values(12, ooo);
(1)どんな鍵が使われますか.
(2)事務Bがブロックされるのではないでしょうか.
回答:トランザクション独立性レベルはRRですが、同じインデックスですが、同じ区間ですが、挿入されたレコードは競合しません.
意向ロックを挿入するのを使用しています
トランザクションBをブロックすることはありません
考え方のまとめ
(1)InnoDBは共有ロックを使用し、読み取り同時性を向上させることができる.
(2)データの強い一致を保証するために、InnoDBは強い反発ロックを使用し、同じ行の記録修正と削除のシリアル性を保証する.
(3)InnoDBは挿入意向ロックを使用し、挿入同時性を高めることができる.
の最後の部分
挿入同時ではなく、読み書き同時であれば、どのような結果になるのでしょうか.
MySQL、InnoDB、デフォルトの独立性レベル(RR).
t(id unique PK, name);
データテーブルにデータがあります.
10, shenjian
20, zhangsan
30, lisi
トランザクションAは先に実行され、いくつかのレコードがクエリされ、まだコミットされていません.
select * from t where id>10;
トランザクションBが実行され、10と20の2つのレコードに1行が挿入されます.
insert into t values(11, xxx);
ここ:
(1)どんな鍵が使われますか.
(2)事務Bがブロックされるのではないでしょうか.
一、オートロック(Auto-inc Locks)
一、ケーススタディ
MySQL、InnoDB、デフォルトの独立性レベル(RR)、データテーブルがあると仮定します.
t(id AUTO_INCREMENT, name);
データテーブルにデータがあります.
1, shenjian
2, zhangsan
3, lisi
トランザクションAは先に実行され、まだコミットされていません:
insert into t(name) values(xxx);
トランザクションBの実行後:
insert into t(name) values(ooo);
問:事務Bはブロックされませんか.
二、ケーススタディ
InnoDBはRR独立性レベルで、上記の例では、幻読みの問題を解決することができます.
(1)トランザクションAがinsertを先に実行すると、(4,xxx)の記録が得られ、自増列であるため、指定idが4であることを表示する必要がなく、InnoDBは自動的に増加し、トランザクションがコミットされていないことに注意する.
(2)トランザクションBの後にinsertを実行し、ブロックされないと仮定すると、(5,ooo)の記録が得られる.
この時、何の問題もありませんでしたが、もし、
(3)取引Aはinsertを継続する:
insert into t(name) values(xxoo);
(6,xxoo)の記録が得られます.
(4)取引A再select:
select * from t where id>3;
結果は次のとおりです.
4, xxx
6, xxoo
画外音:5のレコードをクエリーすることはできません.RRの独立性レベルでは、トランザクションがコミットされていないデータを読み取ることはできません.
あれ、これは事務Aにとって、おかしいですね、AUTO_INCREMENTの列には、2つの記録が連続して挿入され、1つは4で、次の1つは6になり、わけのわからない幻のようだ.
三、オートロック(Auto-inc Locks)
オートロックは、トランザクションに対してAUTO_を挿入する特殊なテーブル・レベル・ロックです.INCREMENTタイプの列.最も簡単な場合、1つのトランザクションがテーブルにレコードを挿入している場合、最初のトランザクションが挿入されたローが連続するプライマリ・キー値であるように、他のすべてのトランザクションの挿入を待つ必要があります.
画外音:公式サイトでは
An AUTO-INC lock is a special table-level lock taken by transactions inserting into tables with AUTO_INCREMENT columns. In the simplest case, if one transaction is inserting values into the table, any other transactions must wait to do their own inserts into that table, so that rows inserted by the first transaction receive consecutive primary key values.
同時に、InnoDBはinnodb_を提供します.autoinc_lock_mode構成は、ロックのモードと動作を調整および変更することができる.
四、自増列でなければ
上の例では,仮に自増列ではないとしたら,どのような状況になるのだろうか.
t(id unique PK, name);
データテーブルにデータがあります.
10, shenjian
20, zhangsan
30, lisi
トランザクションAは先に実行され、10と20の2つのレコードに1行が挿入され、まだコミットされていません.
insert into t values(11, xxx);
トランザクションBが実行されると、10と20の2つのレコードに1行が挿入されます.
insert into t values(12, ooo);
ここでは、自己ロックは使用されません.
(1)どんな鍵が使われますか.
(2)事務Bがブロックされるのではないでしょうか.
共有/排他ロック、意向ロック、挿入意向ロック.
一、共有/排他ロック(Shared and Exclusive Locks)
『InnoDB同時はなぜこんなに高いのか』一般的な共有/排他ロックについて説明しますが、InnoDBではもちろん標準的な行レベルロック(row-level locking)、共有/排他ロックも実現されています.
(1)トランザクションは、ある行のレコードの共有Sロックを取得してこそ、この行を読み取ることができる.
(2)トランザクションは、ある行の記録のXロックを取得してこそ、この行を修正または削除することができる.
互換性のある反発テーブルは次のとおりです.
S X
MS互換反発
X反発
次のようになります.
(1)複数の事務はSロックを手に入れることができ、読み取りは並行することができる.
(2)Xロックを取得できる事務は1つしかなく、書き込み/読み書きは反発しなければならない.
共有/排他ロックの潜在的な問題は、十分な並列ができず、解決構想はデータのマルチバージョンであり、具体的な構想は「InnoDB同時なぜこんなに高いのか」である.で紹介しましたが、ここはもう深く展開しません.
二、意向ロック(Intention Locks)
InnoDBはマルチパーティクルロック(multiple granularity locking)をサポートし、行レベルロックと表レベルロックの共存を可能にし、実際の応用ではInnoDBは意向ロックを使用している.
意向ロックとは、将来のある時点で、トランザクションが共有/排他ロックを追加する可能性があることを意味し、事前に意向を宣言します.
意向ロックには、次のような特徴があります.
(1)まず、意向ロックは、テーブルレベルのロック(table-level locking)である.
(2)意向ロックは以下のように分けられる.
意向共有ロック(intention shared lock,IS)は、トランザクションがテーブルの一部のローに共有Sロックを追加する意向があることを示しています.
意向排他ロック(intention exclusive lock,IX)は、トランザクションがテーブルの一部のローにXロックを追加する意向があることを示しています.
例を挙げます.
select...lock in share mode、ISロックを設定します;
select...for update、IXロックを設定します;
(3)意向ロックプロトコル(intention locking protocol)は複雑ではない:
トランザクションが特定のローのSロックを取得するには、テーブルのISロックを取得する必要があります.
トランザクションが特定のローのXロックを取得するには、テーブルのIXロックを取得する必要があります.
(4)意向ロックは意向を示すだけであるため,実際には比較的弱いロックであり,意向ロック間では互いに反発するのではなく,並列にすることができ,その互換反発表は以下の通りである.
IS IX
IS互換性
IX互換性
(5)ええと,意向ロック間が互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに互いに共有ロック/排他ロックと反発します.反発テーブルは次のとおりです.
S X
IS互換反発
IX反発
画外音:排他ロックは強力なロックで、他のタイプのロックと互換性がありません.これもよく理解されています.あるローを修正して削除するときは、データの一貫性を保障するために、強いロックを取得し、そのローの他の同時性を禁止する必要があります.
三、意向ロック(Insert Intention Locks)を挿入する
既存のデータ行の修正と削除には,反発ロックXロックを強化しなければならないが,データの挿入には,反発を実施するためにこのような強いロックを加える必要があるのだろうか.意向錠を挿入し、生み出す.
挿入意向ロックは、insert操作に特化したギャップロック(Gap Locks)の一種である(したがって、インデックスにも実装されている).
画外音:ちょっと気まずいですが、隙間ロックは次の文章で紹介されます.しばらく理解すると、インデックスに実装され、インデックスのある区間範囲をロックするロックです.
その遊び方は:
複数のトランザクションは、同じインデックス、同じ範囲の区間にレコードを挿入するときに、挿入された場所が衝突しない場合、互いにブロックされません.
画外音:公式サイトでは
Insert Intention Lock signals the intent to insert in such a way that multiple transactions inserting into the same index gap need not wait for each other if they are not inserting at the same position within the gap.
これで、前に穴を掘った例を解くことができます.
MySQL、InnoDB、RRの下:
t(id unique PK, name);
データテーブルにデータがあります.
10, shenjian
20, zhangsan
30, lisi
トランザクションAは先に実行され、10と20の2つのレコードに1行が挿入され、まだコミットされていません.
insert into t values(11, xxx);
トランザクションBが実行されると、10と20の2つのレコードに1行が挿入されます.
insert into t values(12, ooo);
(1)どんな鍵が使われますか.
(2)事務Bがブロックされるのではないでしょうか.
回答:トランザクション独立性レベルはRRですが、同じインデックスですが、同じ区間ですが、挿入されたレコードは競合しません.
意向ロックを挿入するのを使用しています
トランザクションBをブロックすることはありません
考え方のまとめ
(1)InnoDBは共有ロックを使用し、読み取り同時性を向上させることができる.
(2)データの強い一致を保証するために、InnoDBは強い反発ロックを使用し、同じ行の記録修正と削除のシリアル性を保証する.
(3)InnoDBは挿入意向ロックを使用し、挿入同時性を高めることができる.
の最後の部分
挿入同時ではなく、読み書き同時であれば、どのような結果になるのでしょうか.
MySQL、InnoDB、デフォルトの独立性レベル(RR).
t(id unique PK, name);
データテーブルにデータがあります.
10, shenjian
20, zhangsan
30, lisi
トランザクションAは先に実行され、いくつかのレコードがクエリされ、まだコミットされていません.
select * from t where id>10;
トランザクションBが実行され、10と20の2つのレコードに1行が挿入されます.
insert into t values(11, xxx);
ここ:
(1)どんな鍵が使われますか.
(2)事務Bがブロックされるのではないでしょうか.