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

推薦する

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

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

レアタグフィールドセットと凡例の使用方法の詳細な説明

<fieldset>と<legend>については、ほとんどの人はおそらく馴染...

Win10環境にMysql5.7.23をインストールする際の問題点と落とし穴

たくさんのチュートリアルを読みましたが、うまくインストールできませんでした。しばらく試行錯誤した後、...

MySQLリモート接続権限の詳細な説明

1. MySQLデータベースにログインするmysql -u ルート -pユーザーテーブルを表示する ...

WeChatアプレットAmapマルチポイントルート計画プロセス例の詳細な説明

電話Amap API を呼び出す方法は? Amap が https://lbs.amap.com/a...

Windows10 HomeバージョンにDockerをインストールするときに発生する問題の概要

Docker ダウンロード アドレス: http://get.daocloud.io/#instal...

ローカル yum ソースの設定、国内 yum ソースの設定、epel ソースの設定を行う Linux の手順

1. ローカルyumソースを設定する1. ISOイメージをマウントする マウント -o loop /...

HTML <!--...--> コメントタグの役割の詳細な分析

多くのウェブサイトのソースコードを確認すると、多くのコメントが見つかります。特に、ソース文書にコメン...

JavaScript でシンプルなタイマーを実装する

この記事では、参考までに簡単なタイマーを実装するためのJavaScriptの具体的なコードを紹介しま...

コードレイン効果を実現するJavaScriptキャンバス

この記事では、コードレイン効果を実現するためのキャンバスの具体的なコードを参考までに共有します。具体...

MySQLがトランザクション分離を実装する方法の簡単な分析

目次1. はじめに2. RC および RR 分離レベル2.1. RRトランザクション分離レベルでのク...

MySql マスタースレーブレプリケーションメカニズムの包括的な分析

目次マスタースレーブレプリケーションメカニズム非同期レプリケーション準同期レプリケーションマスタース...

正規表現に基づくあいまい文字列置換を実装するMySQLの方法の分析

この記事では、例を使用して、MySQL を使用して正規表現に基づくあいまい文字列置換を実装する方法を...

MySQL 子テーブルで外部キー制約チェックを無効にする方法

準備する:教師テーブルと生徒テーブルを定義し、生徒テーブルで教師テーブルIDを参照します。テーブルt...