MySQL の行レベルロックの詳細な例

MySQL の行レベルロックの詳細な例

序文

ロックは、複数のスレッドを実行するときにリソースへのアクセスを強制的に制限するために使用される同期メカニズムです。データベース ロックは、ロックの粒度に応じて、行レベル ロック、テーブル レベル ロック、ページ レベル ロックに分類できます。

行レベルロック

行レベル ロックは、MySQL で最も粒度の細かいロック メカニズムです。つまり、現在操作されている行のみがロックされます。行レベル ロックの競合の可能性は非常に低く、粒度も最も小さいですが、ロックのコストは最も高くなります。行レベル ロックは、共有ロックと排他ロックに分けられます。

特徴:

オーバーヘッドが高く、ロックが遅く、デッドロックが発生する可能性があります。ロックの粒度が小さく、ロックの競合の可能性が最も高く、同時実行性も高くなります。

実施原則:

InnoDB の行ロックは、インデックス項目をロックすることによって実装されます。これは、MySQL や Oracle とは異なります。後者は、データベース内の対応するデータ行をロックすることによって実装されます。InnoDB の行レベル ロックでは、行レベル ロックはインデックス条件を通じてデータを取得する場合にのみ使用できます。それ以外の場合は、テーブル レベルのロックが直接使用されます。特記事項: 行レベルロックを使用する場合は、インデックスを使用する必要があります

例えば:

テーブル構造を作成する

テーブル「developerinfo」を作成します(
 `userID` bigint(20) NULLではない、
 `name` varchar(255) デフォルト NULL,
 `passWord` varchar(255) デフォルト NULL,
 主キー (`userID`)、
 キー `PASSWORD_INDEX` (`passWord`) BTREE の使用
)ENGINE=InnoDB デフォルト文字セット=utf8;

データの挿入

`developerinfo` に VALUES ('1', 'liujie', '123456') を挿入します。
`developerinfo` に VALUES ('2', 'yitong', '123') を挿入します。
`developerinfo` に VALUES ('3', 'tong', '123456') を挿入します。

(1)主キーインデックスを使用してデータベースを照会し、行ロックを使用する

テスト用に3つのコマンドラインウィンドウを開く

コマンドラインウィンドウ 1コマンドラインウィンドウ 2コマンドラインウィンドウ 3

mysql> 自動コミットを 0 に設定します。
クエリは正常です。影響を受けた行は 0 行です
mysql> userid = '1' の場合、developerinfo から * を選択して更新します。
+--------+--------+----------+
| ユーザーID | 名前 | パスワード |
+--------+--------+----------+
| 1 | liujie | 123456 |
+--------+--------+----------+
セット内の1行 
|mysql> 自動コミットを 0 に設定します。
クエリは正常です。影響を受けた行は 0 行です
mysql> userid = '1' の場合、developerinfo から * を選択して更新します。
wait|mysql> 自動コミットを 0 に設定します。
クエリは正常です。影響を受けた行は 0 行です
mysql> userid = '3' で developerinfo から * を選択して更新します。
+--------+------+----------+
| ユーザーID | 名前 | パスワード |
+--------+------+----------+
| 3 | トング | 123456 |
+--------+------+----------+
セット内の1行
|mysql> コミット;
クエリは正常です。影響を受けた行は 0 行です。mysql> select * from developerinfo where userid = '1' for update;
+--------+--------+----------+
| ユーザーID | 名前 | パスワード |
+--------+--------+----------+
| 1 | liujie | 123456 |
+--------+--------+----------+
セット内の1行

(2)行ロックを使用してデータベースを照会するためにインデックスのないフィールドを照会する

テスト用に2つのコマンドラインウィンドウを開きます

コマンドラインウィンドウ 1コマンドラインウィンドウ 2

|mysql> 自動コミットを 0 に設定します。
クエリは正常です。影響を受けた行は 0 行です
mysql> select * from developerinfo where name = 'liujie' for update;
+--------+--------+----------+
ユーザーID 名前 パスワード
+--------+--------+----------+
1 六十六 123456
+--------+--------+----------+
セット内の 1 行 |mysql> set autocommit=0;
クエリは正常です。影響を受けた行は 0 行です
mysql> select * from developerinfo where name = 'tong' for update;
待ってください|
mysql> コミット;
クエリは正常です。影響を受けた行は 0 行です。mysql> select * from developerinfo where name = 'liujie' for update;
+--------+--------+----------+
| ユーザーID | 名前 | パスワード |
+--------+--------+----------+
| 1 | liujie | 123456 |
+--------+--------+----------+
セット内の1行

##### (3) 非一意のインデックスフィールドを使用してデータベースをクエリし、行ロックを使用して複数の行をロックする

MySQL の行ロックはレコードではなくインデックスの疑似ロックなので、異なるレコードがロックされる可能性があります。

テスト用に3つのコマンドラインウィンドウを開く

コマンドラインウィンドウ 1 コマンドラインウィンドウ 2 コマンドラインウィンドウ 3

mysql> 自動コミットを 0 に設定します。
クエリは正常です。影響を受けた行は 0 行です
mysql> developerinfo から * を選択します。パスワード = '123456
' 更新用;
+--------+--------+----------+
| ユーザーID | 名前 | パスワード |
+--------+--------+----------+
| 1 | liujie | 123456 |
| 3 | トング | 123456 |
+--------+--------+----------+
2 行目: set mysql> set autocommit =0;
クエリは正常です。影響を受けた行は 0 行です
mysql> userid = '1' の場合、developerinfo から * を選択して更新します。

待って

mysql> 自動コミットを 0 に設定します。
クエリは正常です。影響を受けた行は 0 行です
mysql> userid = '2 の developerinfo から * を選択します
' 更新用;
+--------+--------+----------+
| ユーザーID | 名前 | パスワード |
+--------+--------+----------+
| 2 | イートン | 123 |
+--------+--------+----------+
セット内の1行
コミット; mysql> select * from developerinfo where userid = '1' for update;
+--------+--------+----------+
| ユーザーID | 名前 | パスワード |
+--------+--------+----------+
| 1 | liujie | 123456 |
+--------+--------+----------+
セット内の1行

##### (4) データベース検索を実行する条件でインデックスを使用する場合、MySQL はさまざまな実行プランを判断してインデックスを使用するかどうかを決定する必要があります。explain を使用してインデックスを判断する方法を決定する必要がある場合は、次の分析を聞いてください。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

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

<<:  Vue を使用した Amap アプリケーション開発のベスト プラクティス

>>:  Win10 に Tomcat サーバーをインストールし、環境変数を構成する詳細なチュートリアル (画像とテキスト)

推薦する

Datagrip2020 が MySQL ドライバーのダウンロードに失敗する

「downloadlaod」を直接クリックしてもダウンロードできない場合は、ここからダウンロードす...

vsFTP 3.0.3 のコンパイルとインストールの詳細な分析

脆弱性の詳細VSFTP は、GPL に基づいてリリースされた Unix ライクなシステムで使用される...

ハイパーリンクを表示して開く方法

<br />インターネット上の無数の情報は基本的に HTML ドキュメントで構成されてお...

MySQLの重複排除操作を極限まで最適化する方法

目次1. インデックスと変数の賢い使用1. インデックスなしの比較テスト2. created_tim...

MySQLにおけるACIDトランザクションの実装原理の詳細な説明

導入いつものように、シーンから始めましょう〜インタビュアー:「トランザクションの4つの特性をご存知で...

Win10にmysql8.0.15 winx64をインストールしてサーバーに接続する際に問題が発生しました

1. mysql-8.0.15をダウンロード、インストール、設定する1. 公式サイト (https:...

sqlite3 から mysql に移行するときに起こりうる問題のコレクション

簡単な説明適切な読者: モバイル開発sqlite3 データを mysql に移行する場合、多くの構文...

Docker5フル機能の港湾倉庫構築プロセス

Harbor は、Docker イメージを保存および配布するためのエンタープライズ レベルのレジスト...

MySQL Limitクエリのパフォーマンスを向上させる方法

MySQL データベース操作では、一部のクエリを実行するときにデータベース エンジンが完全なテーブル...

MySQL で not in を使用して null 値を含める問題を解決する

知らせ! ! ! uid が (a,b,c,null) に含まれないユーザーから * を選択します。...

最新の JavaScript で非同期タスクを書く方法

序文この記事では、非同期 JavaScript の進化と、それがコードの記述方法にどのような変化をも...

CSS でインラインブロック要素間のギャップを削除するいくつかの方法の詳細な説明

最近、モバイルページを制作する際には、レイアウトにインラインブロック要素がよく使われますが、インライ...

MySQLの3つの用途と違いは同等ではない

MySQLでは判定記号がよく使われますが、等しくない記号はもっと一般的に使われます。次の3つの等しく...

vue3 プロジェクトを素早く構築し、関連機能を紹介する vite+ts の詳細な説明

目次ヴィテ建てる構成vite.config.tsルーターtsタイプvue3 の知識設定小道具コンテク...

React refの使用例

目次refとは何かrefの使い方DOM要素に配置するクラスコンポーネントに配置する関数コンポーネント...