ホームページ  >  記事  >  データベース  >  mysqlの行レベルロックの実装原理は何ですか?

mysqlの行レベルロックの実装原理は何ですか?

coldplay.xixi
coldplay.xixiオリジナル
2020-10-26 15:47:236054ブラウズ

mysql 行レベル ロックの実装原則: 1. InnoDB 行ロックはインデックス項目をロックすることによって実現されます。これが mysql と mysql の違いです。 Oracle は異なります; 2. InnoDB は行レベルのロックを決定します。行レベルのロックは、インデックス条件を通じてデータを取得するためにのみ使用できます。それ以外の場合は、 テーブルレベルのロックを直接使用します。

mysqlの行レベルロックの実装原理は何ですか?

mysql 行レベル ロックの実装原則:

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

行レベルのロック

行レベルのロックは、mysql で最もきめの細かいロック メカニズムです。つまり、現在操作されている行はロックされており、行レベルのロックの競合が発生します。 確率は非常に低く、粒度は最も小さくなりますが、ロックのコストは最も高くなります。行レベルのロックは、共有ロックと排他ロックに分類されます。

特徴:

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

実装原理:

InnoDB の行ロックは、インデックス項目をロックすることによって実装されます。これは、mysql や oracle とは異なります。後者は実現されます。データベース内のインデックス項目をロックすることによって。 これは、対応するデータ行をロックすることで実現され、InnoDB の行レベルのロックは、行がインデックス条件によるデータの取得にのみ使用できることを決定します。 レベル ロック、それ以外の場合は、テーブル レベルのロックを直接使用します。 #########注意してください: 行レベルのロックを使用する場合は、インデックスを使用する必要があります。

例:

テーブル構造の作成

CREATE TABLE `developerinfo` (
  `userID` bigint(20) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `passWord` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`userID`),
  KEY `PASSWORD_INDEX` (`passWord`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
データの挿入

INSERT INTO `developerinfo` VALUES ('1', 'liujie', 

'123456');
INSERT INTO `developerinfo` VALUES ('2', 'yitong', '123');
INSERT INTO `developerinfo` VALUES ('3', 'tong', 

'123456');
(1) 主キー インデックスを使用してデータベースにクエリを実行し、行ロックを使用します。

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

コマンド ライン ウィンドウ 1 コマンド ライン ウィンドウ 2 コマンド ライン ウィンドウ3
##mysql> set autocommit = 0;
クエリ OK、 影響を受ける行は 0 件です
mysql>select * from developerinfo where userid = '1' for アップデート;######### - - - - -------- ----------
| ユーザー ID | 名前 | パスワード |
------- --------- ----------
| 1 | liijie | 123456 |
-------- -------- ----------
set
mysql の 1 行> set autocommit = 0;
クエリOK、 影響を受ける行は 0 件です
mysql>select * from developerinfo where userid = '1' for 更新;お待ちください
mysql>set autocommit = 0;
クエリ OK、0 行 影響を受ける
mysql> select * from developerinfo where userid = '3' for 更新;
-------- ------ ----------
| ユーザー ID | 名前 | パスワード |
-------- ------ ----------
| 3 | トング | 123456 |
-------- ------ ---------- セットの
1 行
mysql> commit;
クエリ OK、 影響を受ける行は 0 件です
mysql> select * from 更新用のユーザー ID = '1' の開発者情報;
-------- -------- ----------
| ユーザー ID | 名前 | パスワード |
-------- ------- - ----------
| 1 | liijie | 123456 |
-------- -------- ----------
セット内の 1 行

#(2) インデックスのないフィールドをクエリして、行ロックを使用してデータベースをクエリする
##テスト用に 2 つのコマンド ライン ウィンドウを開く

コマンド ライン ウィンドウ 1コマンド ライン ウィンドウ 2クエリ OK、影響を受ける行は 0 ですmysql> select * fromDeveloperinfo where name = 'liijie' for update; -------- -------- ---------- mysql> ; select * fromDeveloperinfo where name = 'liijie' for 更新; -------- -------- -------- ---------- | 1 | liijie | 123456 |
##mysql> set autocommit=0;
| ユーザー ID | 名前 | パスワード |
-------- -------- ----------
| 1 | liijie | 123456 |
-------- -------- ---------- セットの
1 行


mysql> セット autocommit=0;
クエリ OK、影響を受ける行は 0 件です
mysql> select * fromDeveloperinfo where name = 'tong' for update;Wait

##mysql> commit;

Query OK、影響を受ける行は 0 です
| ユーザー ID | 名前 | パスワード |
------ -- -------- ----------
-------- - ------- - ------------- セットの
1 行



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

Mysql の行ロックは、レコードではなくインデックスに対する偽のロックであるため、異なるレコードが存在する可能性があります。シナリオ

テストのために 3 つのコマンド ライン ウィンドウを開きます

コマンド ライン ウィンドウ 1 コマンド ライン ウィンドウ 2 コマンド ライン ウィンドウ 3
mysql> set autocommit=0;
クエリ OK、影響を受ける行は 0 です
mysql> select * fromDeveloperinfo where パスワード = '123456
' for update;
-------- -------- ----------
| userID | 名前 | パスワード |
-------- -------- ----------
| 1 | liijie | 123456 |
| 3 | トング | 123456 |
-------- -------- ----------
set 内の 2 行
mysql> set autocommit =0 ;
Query OK、0 行が影響を受けました

mysql> select * from developerinfo where userid = 更新の場合は '1';

Waiting

mysql> set autocommit = 0;
Query OK、0 行 影響を受ける
mysql> select * from developerinfo where userid = '2
' for 更新;
-------- -------- -------- ----------
| ユーザー ID | 名前 | パスワード |
------ -- -------- ----------
| 2 | イートン | 123 |
-------- -------- -------- ---------- セット内の
1 行
commit ; mysql> select * from developerinfo where userid = '1' for 更新;
-------- -------- -------- ----------
| ユーザー ID | 名前 | パスワード |
------ -- -------- ----------
| 1 | liijie | 123456 |
-------- - ------- - -------- セット内の
1 行

(4 ) 検索を操作する条件にインデックスを使用する データベースを使用する場合、インデックスを使用するかどうかは、mysql によって異なる実行計画を決定する必要があります。 インデックスを使用するかどうかを決定します。Explain を使用してインデックスを決定する方法を決定する必要がある場合は、次の章の分解を聞いてください。

その他の関連する無料学習の推奨事項: mysql チュートリアル(ビデオ)

以上がmysqlの行レベルロックの実装原理は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。