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 のリンク解除機能とファイルの削除方法

推薦する

VueはCanvasを使用してランダムなサイズで重なり合わない円を生成します

目次キャンバス関連文書エフェクト画像表示ケースの完全なコード親コンポーネントコードサブコンポーネント...

MySQL ロック(テーブルロック、行ロック、共有ロック、排他ロック、ギャップロック)の詳細な説明

現実世界では、鍵は外の世界から身を隠したいときに使用するツールです。コンピュータでは、複数のプロセス...

Windows 7 環境での Docker 高速ビルドと Alibaba Cloud コンテナ高速化構成の詳細な説明

前回の Docker に関する記事では、MAC システムでの構築について説明しました。この記事では、...

uniapp 要素ノードスタイルの動的変更の詳細な説明

目次1. スタイル属性をバインドして変更するhtml:対応するjs:達成された効果:次に、refを使...

Linux seqコマンドの使い方の詳しい説明

01. コマンドの概要seq コマンドは整数のシーケンスを生成するために使用されます。 02. コマ...

Python Flask WeChat アプレットのログインプロセスとログイン API 実装コード

1. まずは効果を見てみましょうインターフェース要求によって返されるデータ: 2. 公式ログインフロ...

Mac に Windows サービスを備えた仮想マシンをインストールする方法

1. 仮想マシンをダウンロードする公式ダウンロードウェブサイト: https://www.vmwar...

HTMLにスクリプトを追加する2つの方法と注意点

HTML に <script> スクリプトを追加する方法: 1. HTMLにJavaSc...

MySQL データベースのホットスタンバイにおける問題点の分析

以前、MySQL データベースのデュアルマシン ホット スタンバイの設定方法を紹介しました。ご興味の...

Linuxでディレクトリを効率的に切り替える方法

Linux でディレクトリを切り替えるとなると、誰もが間違いなくcdコマンドを思い浮かべるでしょう。...

データベースのインデックス作成に関する知識ポイントのまとめ。必要な情報はすべてここにあります。

データベースインデックスについては皆さんもよくご存知だと思います。 インデックスは、データベース テ...

Vueプロジェクトでコンポーネントをカプセル化する簡単な手順

目次序文Toastコンポーネントをカプセル化する方法ユースケース具体的な実装要約する序文ビジネスが発...

フォーム OnSubmit と input type=image の使用の概要

ここに <input type="image"> がある場合、この画...

ブラインドの特殊効果を実現するネイティブJS

この記事では、ネイティブ JS で実装されたブラインドの特殊効果を紹介します。効果は次のとおりです。...

Vueはカードフリップ効果を実現します

この記事では、カードフリップ効果を実現するためのVueの具体的なコードを例として紹介します。具体的な...