MySQLの共有ロックと排他ロックの使用例の分析

MySQLの共有ロックと排他ロックの使用例の分析

この記事では、例を使用して MySQL の共有ロックと排他ロックの使用方法を説明します。ご参考までに、詳細は以下の通りです。

MySQL のロック メカニズムは、テーブル レベル ロックと行レベル ロックに分かれています。この記事では、MySQL の行レベル ロックにおける共有ロックと排他ロックに関する私の共有とコミュニケーションを皆さんと共有します。

共有ロックは読み取りロック、または略して S ロックとも呼ばれます。名前が示すように、共有ロックとは、複数のトランザクションが同じデータのロックを共有し、データにアクセスできるものの、読み取りのみが可能で変更はできないことを意味します。

排他ロックは書き込みロック、または略して X ロックとも呼ばれます。名前が示すように、排他ロックは他のロックと共存できません。たとえば、トランザクションがデータ行の排他ロックを取得した場合、他のトランザクションは、共有ロックや排他ロックなど、その行の他のロックを取得できません。ただし、排他ロックを取得したトランザクションは、データの読み取りと変更を行うことができます。

共有ロックについては、複数のトランザクションがデータを読み取ることはできても変更することはできないという点については、誰もがよく理解しているかもしれません。しかし、排他ロックについては、人によって理解が異なる場合があります。私は最初、排他ロックがデータ行をロックすると、他のトランザクションはそのデータ行を読み取ったり変更したりできなくなると考えていましたが、これは間違いでした。実際にはそうではありません。排他ロックとは、トランザクションがデータ行に排他ロックを追加した後、他のトランザクションがその行に他のロックを追加できないことを意味します。 MySQL InnoDB エンジンのデフォルトのデータ変更ステートメントである update、delete、および insert は、関連するデータに排他ロックを自動的に追加します。select ステートメントは、デフォルトではロック タイプを追加しません。排他ロックを追加する場合は、select ... for update ステートメントを使用できます。共有ロックを追加する場合は、select ... lock in share mode ステートメントを使用できます。したがって、排他ロックが設定されたデータ行は、他のトランザクションでは変更できず、共有モードで更新およびロックをクエリすることもできません。ただし、通常のクエリにはロック メカニズムがないため、select ...from... を通じてデータを直接クエリすることはできます。

ここまで述べてきましたが、次の簡単な例を見てみましょう。

以下のテストデータがあります

ここで、id=1 のデータ行のみをクエリします。ここでは、begin を使用してトランザクションを開きます。トランザクションを閉じることは表示されません。これは、トランザクションをコミットするか、トランザクションをロールバックするとロックが解除されるため、テストのために行われます。

クエリウィンドウを開く

データが見つかります。次に、別のクエリ ウィンドウを開き、排他クエリと共有ロック クエリを使用して同じデータをクエリします。

限定チェック

共有クエリ

id=1 のデータが排他ロックでロックされており、ここでのブロックは排他ロックが解除されるのを待機しているため、排他ロック クエリと共有ロック クエリの両方がブロックされた状態になっていることがわかります。

次のクエリを直接使用するとどうなるでしょうか?

データをクエリできることがわかります。

共有ロックを取得するトランザクションを見てみましょう。他のクエリでは、共有ロックのみを追加したり、ロックを追加しなかったりすることができます。

データはクエリできますが、排他ロックと共有ロックは同じデータに存在できないため、排他ロックを使用してクエリすることはできません。

最後に、前述の MySQL InnoDb エンジンにおける更新、削除、挿入ステートメントの自動排他ロックの問題を検証してみましょう。

このとき、共有クエリは排他ロックが解除されるのを待ってブロックされますが、排他ロックと相互に排他的なロック機構がないため、通常のクエリを使用してデータを見つけることができます。ただし、見つかったデータはデータが変更される前の古いデータです。

次に、データをコミットし、排他ロックを解除して、変更されたデータを確認します。このとき、排他クエリ、共有クエリ、および通常のクエリを使用できます。トランザクションがコミットされた後、データ行の排他ロックが解除されるため、以下は通常のクエリのみが表示されます。他の学生は自分で確認できます。

結果は予想通りであることがわかります。

上記は、MySQL の共有ロックと排他ロックについての私の個人的な理解です。不正確な点がありましたら、ご指摘いただければ幸いです。

MySQL 関連のコンテンツにさらに興味がある読者は、次のトピックを確認してください: 「MySQL データベース ロック関連スキルの概要」、「MySQL ストアド プロシージャ スキルの概要」、「MySQL 共通関数の概要」、「MySQL ログ操作スキルの概要」、および「MySQL トランザクション操作スキルの概要」。

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQLデッドロック問題の詳細な分析
  • MySql のインデックス、ロック、トランザクションの知識ポイントのまとめ
  • MySQLのグローバルロックとテーブルロックに関する詳細な理解
  • MySQL の行レベルロックの詳細な例
  • MySQL ロックの知識ポイントのまとめ

<<:  Node.js の fs モジュールと Path モジュールのメソッドの詳細な説明

>>:  Linux のリンク解除機能とファイルの削除方法

推薦する

Docker クロスホストネットワークの実装 (手動)

1. Macvlan の紹介Macvlan が登場する前は、イーサネット カードに複数の IP ア...

Angularフレームワークのビュー抽象定義の詳細な説明

序文「大規模なフロントエンド プロジェクト向け」に設計されたフロントエンド フレームワークである A...

最新の高品質な英語無料フォント36個を公開

01. 無限フォントのダウンロード02. バンダフォントのダウンロード03. ロールアップフォントの...

WeChatアプレットで画像の幅と高さを取得する方法

起源最近、私は要件 A に取り組んでいます。そこには、次のように記述される小さな機能ポイントがありま...

Ubuntu 20.04の新バージョンでルートユーザーを使用してシステムにログインする方法の詳細なチュートリアル

Ubuntu 20.04 では、デフォルトで root ログインが有効になっていないため、デスクトッ...

PHP クラスにおける static と self の違いの簡単な分析

メソッドが定義されているクラスに応じて、現在のクラスへの静的参照を取得するには、self:: または...

セマンティック HTML 構造の利点は何ですか?

1つ: 1.セマンティック タグは単なる HTML であり、CSS にはセマンティクスはありません...

自動ロック画面機能を実現するjs

1. 使用シナリオこのような要件があるため、システムが開発されました。ユーザーがデスクトップを離れ...

角度に基づくツリー型セカンダリテーブルを実現する

まず効果を見てみましょう: コード: 1.html <div class="user...

HTMLチェックボックス説明テキストをクリックして状態を選択/チェック解除します

Web 開発では、チェックボックスは小さく、ユーザーにとって操作があまり便利ではないため、ユーザーが...

Redission-tomcatは、単一マシンから複数マシンへの展開を迅速に実装します。

序文一部のプロジェクトの初期段階では、シンプルさとスピードのために、開発と展開は単一のマシンで行われ...

JavaScript の new 演算子の原理と例の詳細な説明

新しい用途new の機能は、コンストラクターを通じてインスタンス オブジェクトを作成することです。イ...

Vueドロップダウンリストの2つの実装方法の比較

Vueドロップダウンリストの2つの実装最初の方法はv-forを使用する <el-select ...

Win2008 R2 mysql 5.5 zip 形式 mysql のインストールと設定

Win2008 R2 zip形式のMySQLのインストールと設定1. Baidu MySQL 5.6...

Vue で手ぶれ補正を実装するためのサンプルコード

手ぶれ防止: 繰り返しのクリックによるイベントのトリガーを防止まず、揺れとは何でしょうか? 震えるの...