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

推薦する

ボタンをクリックした後のCSS読み込み効果を実現する

自社製品にクリック後1~2秒待機時間があるボタン(確認メールを送信する)があるため、クリック後の1~...

Windows での MySQL 8.X インストール チュートリアル

以前は MySQL 5.7 を使用していましたが、MySQL にいくつか新しい機能が追加されたため、...

純粋なCSS3で実装されたネオンライト効果

達成される効果は次のとおりです。 マウスがボタン内に移動すると、ネオンライトのような効果が生成され、...

docker ストレージを使用して Exit を実行すると、サーバーへのファイルのアップロードが失敗する問題と解決策

1. 問題の説明Docker コンテナにインストールされているストレージが終了状態になっているため、...

Jenkins の docker-compose デプロイメントと構成に関する詳細なチュートリアル

Docker-compose デプロイメント構成 Jenkins 1. Docker-compose...

Vueのコンポーネントの詳細な説明

目次1. コンポーネントの登録2. コンポーネントの使用3. 父から息子へ4. 息子から父へ5. ス...

JavaScript と JQuery フレームワークの基本チュートリアル

目次1. JS オブジェクトDOM –1、機能–2、テスト3. jQuery –1. 概要–2、使用...

Element+vueを使用して開始時間と終了時間の制限を実装する

この記事の例では、Element+vueを使用して開始と終了の時間制限を実装するための具体的なコード...

Linuxで$を#に変更する方法

このシステムでは、# 記号は root ユーザーを表し、$ 記号は通常のユーザーを表します。では、ど...

MySQL 5.7.17 のインストールと設定方法のグラフィックチュートリアル (Win7 の場合)

Windows 7 で MySQL 5.7.17 をインストールする方法についてのグラフィック チ...

Windows で Graphviz をインストールして開始する方法のチュートリアル

ダウンロードとインストール環境変数の設定インストール環境変数の設定確認基本的な描画の紹介グラフディグ...

MySQL 8.0.21 のインストール手順と問題解決

公式サイトをダウンロードまず公式ウェブサイトにアクセスしてMySQLをダウンロードしてくださいリンク...

mysql.data.dll ドライバーのさまざまなバージョンの簡単な分析

ここにmysqlドライバmysql.data.dllがあります知らせ:ここではX86バージョンが多く...

使用したコマンドを表示するLinuxコマンドメソッドの概要

システムでは多くのコマンドが使用されていますが、使用したコマンドをどのように確認すればよいでしょうか...

MySQL のマスター スレーブ レプリケーション オプションをオンラインで変更する方法

序文: MySQL で最も一般的に使用されるアーキテクチャは、マスター スレーブ レプリケーションで...