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 サーバーをインストールし、環境変数を構成する詳細なチュートリアル (画像とテキスト)

推薦する

レスポンシブ原則と Vue2.0/3.0 の違いについての簡単な分析

序文vue3.0 が正式にリリースされて以来、多くの友人が vue3.0 に切り替えました。ここでは...

js 正規表現の先読みと後読み、および非キャプチャグループ化

目次先読みと後読みをキャプチャグループと組み合わせる捕獲グループと非捕獲グループ前を向いて、後ろを振...

Vue3 のレンダリング関数における互換性のない変更の詳細な説明

目次レンダリングAPIの変更レンダリング関数のパラメータレンダリング関数のシグネチャの変更VNode...

Dockerを使用してMQTTサーバーを構築するプロセスの詳細な説明

1. イメージをプルするdocker pull registry.cn-hangzhou.aliyu...

Docker の NFS-Ganesha イメージを使用して NFS サーバーを構築する詳細なプロセス

目次1. NFS-Ganeshaの紹介2. NFS-Ganeshaの設定3. NFS-Ganesha...

CSS子要素選択親要素の実装

通常、CSS セレクターは上から下に選択し、親要素を介して子要素を選択します。では、子要素を介して親...

WeChat アプレットのカスタム下部ナビゲーション バー コンポーネント

この記事の例では、WeChatアプレットの下部ナビゲーションバーコンポーネントの具体的な実装コードを...

Linuxで環境変数を削除する詳細な手順

Linuxで環境変数を削除するには?unsetコマンドを使用してすぐに削除します1. Linuxクラ...

SSH ポート転送、ローカル ポート転送、リモート ポート転送、動的ポート転送の詳細

パート 1 SSH ポート転送の概要カフェで無料Wi-Fiを利用しているとき、誰かがあなたのパスワー...

HTML タグのセマンティクス化 (H5 を含む)

導入HTML は、Web ドキュメントのコンテンツのコンテキスト構造と意味を提供します。HTML 自...

Xshellの一般的な問題と関連する設定の詳細な説明

この記事では、Xshell と関連する構成の一般的な問題について説明します。この記事の構成は、主に ...

MySQL 内部結合の使用例 (必読)

文法規則 列名を選択 テーブル名1から INNER JOIN テーブル名2 ON テーブル名1.列名...

JavaScript での HTML キャンバスとページ ストレージ テクノロジの使用に関する詳細な説明

目次1. JavaScriptはHTMLでキャンバスを使用する2. ページストレージ技術1. Jav...

mysqlは内部コマンドエラーの解決策ではありません

「mysqlは内部コマンドではありません」というエラーは、mysqlのbinディレクトリパスが環境変...

MySQL はエンタープライズレベルのログ管理、バックアップ、リカバリの実践的なチュートリアルを実装します

背景事業が発展するにつれ、会社の事業内容や規模は拡大し続け、ウェブサイトには大量のユーザー情報やデー...