MySQL Advanced Road(14)-InnoDBのロックとは何ですか?それを理解する人!

MySQL Advanced Road(14)-InnoDBのロックとは何ですか?それを理解する人!

I.概要

前回の記事では、MVCCメカニズムについて詳しく紹介しました。これは、他のトランザクションが更新されたときの読み取り方法の問題を解決します。本日紹介するのは、他のものが更新されたときに更新される方法の問題を解決することです。実際、ロックメカニズムはMySQLだけでなく、Javaなどの多くのコンピューター言語で見ることができ、redisなどのミドルウェアにもロックメカニズムがあります。全体として、ロックしないと、コンピューターの世界は混沌とし、プログラムは連携せず、コードは非常に複雑になります。

2.MySQLでロックがどのように機能するか

MySQLでは、ロックはリソース(テーブル、行、内部データ構造など)へのアクセスを制御します。たとえば、同じ行のデータまたは同じテーブルを同時に更新するトランザクションが複数存在することはできません。トランザクションはテーブルを更新できません。別のことがテーブルのデータを挿入または削除する場合。

InnoDBのロックは軽量構造を使用しており、トランザクションは通常、短時間(ミリ秒またはマイクロ秒で測定)保持されます。これもよく理解しておく必要があります。AとBの2人が同時に同じ行のデータを更新します。最初にロックを追加してから、データの更新を開始します。このとき、Bも更新したいと考えています。データがあれば、ロックが保持されているかどうかを確認します。保持されている場合は、しばらく待って、後で誰かがロックを保持しているかどうかを確認します。上記のプロセスでは、それぞれがロックデータインターフェイスを生成し、trx_idと待機状態を記録します。データの行を更新すると、そのデータの行にロックが追加されます。他のものがプリエンプトされていることが判明した場合ロックの状態がtrueになるまで待機し、最初に待機して、後で再試行するだけです。以下のように

画像の説明を追加してください

上記の例のロックは相互排他ロックです。つまり、データをロックできるのは最大で1人だけです。データベースの排他ロック

3. MySQLにはどのようなロックがありますか?

InnoDBには次の種類のロックがあります。

  • 共有ロック/排他ロック
  • インテントロック
  • レコードロック
  • ギャップロック
  • 次へ-キー锁
  • インテント挿入ロック
  • AUTO-INCロック
  • 述語ロック

それらが何であるかを見てみましょう。ここでは、私たちと最も密接に関連しているものだけを紹介します。まれなものについては、自分で関連情報を確認できます。

共有ロック/排他ロック

英語名は共有ロックと排他ロックであるため、 SロックおよびXロックとも呼ばれます。このロックの機能は、名前が示すとおりです。次に例を示します。スレッドAがSロックでデータをロックした後、スレッドBもこのデータにSロックを追加できますが、Xロックは相互に排他的であり、1つしか許可されないため、このデータにXロックを追加することはできません。同時に追加されます。ロックします。これを理解するのは難しいことではないと思いますが、アプリケーションのシナリオはどうでしょうか。Sロックによって複数のトランザクションがデータの行を共有できることを知るのは難しいことではありません。混乱が発生しないように、Sロックを持つすべてのトランザクションが読み取られている必要があります。Xロックについてはどうでしょうか。実際、この種の操作では、同じデータに対して同時に複数のトランザクションを実行することは絶対にできないため、更新または削除するときは非常に簡単で確実です。

したがって、SロックとXロックの機能を知ることは難しくありません。

Sロック:ロックを保持しているトランザクションが読み取り操作を実行できるようにします

Xロック:ロックのあるトランザクションが操作を更新または削除できるようにします

:SロックとXロックの両方が行にロードされるため、行ロックとも呼ばれます

インテントロック

このロックは、「意図」の意味を理解した後でのみ、その意味を理解します。InnoDBのロックは、複数粒度をサポートしています。行ロックは上記のとおりです。この意図ロックは、実際にはテーブルロックであり、意図共有ロック( ISロック)と意図排他ロック(IXロック)に分けられ、テーブル。このインテントロックはどのように使用されますか?データの一部を見つけた方法を思い出してください。最初に対応するテーブルを見つけ、次に対応する行を見つけましたか?このロックプロセスは実際には同じです。行のロックを取得する前に、テーブルのロックを取得する必要があります。次の行にSロックを追加するときは、最初にテーブルのISロックを取得する必要があります。同様に、 Xロックを行に追加するとき最初にテーブルのIXロックを取得する必要があるとき。(注:S / Xロックとは異なり、複数のトランザクションでISロックとIXロックをテーブルに追加できますが、一度にテーブルのIXロックを取得できるのは1つのトランザクションのみです)。

以下は、ロックおよびロックの取得のためのSQLステートメントです。

# 可以通过下面的语句来获取指定表的意向排它锁(获取表的IX锁,只能有一个事物获取到)
LOCK TABLES ... WRITE

# 加上意向共享锁(加IS锁,同一个表可以加多个)
SELECT ... LOCK IN SHARE MODE

# 加上意向排他锁
SELECT ... FOR UPDATE(加IX锁,同一个表可以加多个)

# 查看事物的加锁状态(在Status列中的TRANSACTIONS部分可以查看)
SHOW ENGINE INNODB STATUS

これらのロック間の互換性の関係は次のとおりです。

バツ IX S
バツ 対立 対立 対立 対立
IX 対立 互換性 対立 互換性
S 対立 対立 互換性 互換性
対立 互換性 互換性 互換性

この時点で、意図的なロックの役割を理解することは難しくありません。

この完全な操作に加えて、インテンションロックは何も妨げません。これはテーブル名のインテンションであり、「インテント」という名前の由来でもある、後でデータの行を操作する、または操作する可能性があることを示します。LOCK TABLES ... WRITE

レコードロック

レコードロックは、その名前が示すように、インデックス付きレコードで使用されます。インデックスのレコードがロックされると、他のものがこのレコードを挿入、更新、または削除するのを防ぐことができます。上記の行レベルのロックは、基本的にレコードロックです。

インデックスを作成しない場合、InnoDBは非表示のローカルクラスター化インデックスを作成します

ギャップロック

ギャップロックは、その名前が示すように、ギャップをロックするために使用されますが、それはどのようなギャップですか?実際、それはインデックスのギャップです。質問があるかもしれませんが、どのような状況でインデックスのギャップをロックする必要がありますか?例を挙げましょう。トランザクションAはこのようなSQLステートメントを実行しています。SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20トランザクションAがこのSQLの実行を終了した後、トランザクションBはデータc1 = 11を挿入し、トランザクションAはコミットする前にこのステートメントを再度実行します。この時点で、トランザクション前後2回同じ範囲から取得したデータが実際に異なることがわかりましたか?幻读この状況は、幻覚のように、前の記事で私が言ったことです!

範囲条件を持つこのWHERE条件では、ファントム読み取りを防ぐために、この範囲内のギャップにギャップロックを追加する必要があります。SQLは次のように記述されます。SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATEそうすると、他のものが実行されなくなります。 〜1015の範囲のデータを挿入する操作

ギャップは、単一または複数のインデックス値にまたがる場合があり、空の場合もあります。一意のインデックスを使用して一意の行を検索するステートメントでは、ギャップロックは必要ありません。

SELECT * FROM child WHERE id = 100;

idにインデックスが付けられていないか、一意でないインデックスがある場合、ステートメントは前のギャップをロックします。

同じギャップに対して、複数のトランザクションがギャップロックを追加できることに注意してください。

上記の内容を理解した後、ギャップロックの役割を理解することは難しくありません。

ギャップロックには「純粋な一貫性」があり、その唯一の目的は、他のものがギャップに挿入されるのを防ぐことです。ギャップロックは共存できます。あるトランザクションによって取得されたギャップロックは、別のトランザクションが同じギャップに対してギャップロックを取得することを妨げません。共有ギャップロックと排他ギャップロックに違いはありません。それらは互いに競合せず、同じ機能を実行します。

次へ-キー锁

名前からするとわかりにくいですが、まずはこのロックの様子をお話ししましょう。いわゆるネクストキーロックは、実際にはギャップロックとレコードロックを組み合わせたものです。その機能は、発生を防ぐことです。ファントムリーディングギャップロックと言えば、事物の前後の2つの範囲クエリのデータ量が同じであることを確認することしかできませんが、データの変更を防ぐことはできません。したがって、ギャップロックだけで-繰り返し可能な読み取り。これを防ぐために、レコードロックを監視して組み合わせて使用​​します。

InnoDBのデフォルトは、REPEATABLE READ分離レベルです。インデックスを検索またはスキャンすると、検出されたギャップとレコードにギャップロックとレコードロックが追加されます。つまり、Next-Keyロックが次々に追加され、他の問題を防ぐことができます。物事は前に新しいレコードを挿入します。これは、次々とロック動作するため、Next-Keyロックの名前の由来である可能性があります。

要約すると、Next-Keyロックの役割を見ることができます。

InnoDBは、REPEATABLE READレベルでNext-Keyロックを使用して、ファントム読み取りが発生しないようにします

他のロック

意図的な挿入ロックAUTO-INCロック、および述語ロックについては、比較的偏っているため、この記事では詳しく説明しません。興味がある場合は、関連情報を自分で確認できます。上で説明したロックを理解した後、残りのロックは確かに理解するのは難しいことではないと思います

4.まとめ

今日、私はInnoDBのロックと一般的なタイプを紹介しました。それらの粒度と機能は異なり、さまざまな問題を解決するために生まれました。したがって、それらがどの問題を解決するために使用されるかを理解することは非常に重要です。

上記はこの記事の全内容です。問題がある場合は、それを指摘して一緒に進んでください。

おすすめ

転載: blog.csdn.net/weixin_44829930/article/details/120851278