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

推薦する

VMware10 での CentOS 7 のインストールと設定のチュートリアル

Ubuntu が今日のデスクトップ ユーザーの間で最も人気のある Linux オペレーティング シス...

MySQL における 8 つの一般的な SQL 使用例

序文MySQL は、2016 年もデータベースの人気において力強い成長傾向を維持し続けました。 My...

Mysql のデッドロックの表示とデッドロックの除去の詳細な説明

序文しばらく前にMysqlのデッドロック問題に遭遇したので、解決しました。問題の説明: Mysql ...

node.jsのインストールとHbuilderXの設定の詳細な説明

npm インストールチュートリアル: 1. Node.jsインストールパッケージをダウンロードする公...

HTML 左、中央、右の適応レイアウト (calc css 式を使用)

最新の HTML 標準には、レイアウトを計算するために使用できる calc CSS 式があります。し...

Windows 10 Home Edition に Docker for Windows をインストールする

0. 背景ハードウェア: Xiaomi Notebook Air 13/Inter Core i7-...

MySQL pt-slave-restart ツールの使い方の紹介

目次MySQL マスター スレーブ レプリケーション環境を設定する場合、マスター データベースとスレ...

MySQL における between の境界と範囲の説明

境界範囲間のmysql間の範囲は両側の境界値を含む例: 3 から 7 までの id は、id >...

LinuxのCPU負荷とCPU使用率の詳細な説明

CPU 負荷と CPU 使用率これらは両方とも、ある程度、マシンの忙しさを反映できます。 CPU 使...

Manjaro インストール CUDA 実装チュートリアル分析

昨年末、Thinkpad T450 のデュアルシステムの opensuse を Manjaro に置...

CSS3 はクールな 3D 回転遠近法効果を実現します

CSS3はクールな3D回転パースペクティブを実現します3D アニメーション効果はますます人気が高まっ...

MySQL データベース ターミナル - 一般的な操作コマンド コード

目次1. ユーザーを追加する2. ユーザー名とホストを変更する3. パスワードを変更する4. ユーザ...

Vueでjsonpを使用する方法

目次1. はじめに2. インストール3. 使用4. vueファイルの使用1. はじめに最近、手書き入...