mysqlロック実戦テストコード

5432 ワード

ストレージエンジン
サポートされているロック
MyISAM
テーブルレベルロック
MEMORY
テーブルレベルロック
InnoDB
行レベルロック
BDB
ページロック
表レベルのロック:オーバーヘッドが小さく、ロックが速い.デッドロックは発生しません.ロック粒度が大きく、ロック衝突が発生する確率が最も高く、同時度が最も低い.行レベルロック:オーバーヘッドが大きく、ロックが遅い.デッドロックが発生します.ロック粒度は最小であり,ロック衝突が発生する確率は最低であり,同時度も最高である.ページロック:オーバーヘッドとロック時間はテーブルロックとローロックの間に境界があります.デッドロックが発生します.ロック粒度はテーブル・ロックとロー・ロックの間にあり、同時性は一般的です.
ロックモード
ロックされたスレッド読み込みの実行
その他のスレッド読み
ロックされたスレッド書き込みの実行
その他のスレッドの書き込み
リードロック
読み取り可能
読み取り可能
書き込み不可
書き込み不可
書き込みロック
読み取り可能
読み取り不可
書き込み可能
書き込み不可
関連ツール:NavicatとSQLyog(phpMyAdminは使用できません)
テストコード
テスト1:リードロック.説明:自分と他のスレッドはテーブルのみを読み込むことができます.
Navicatで次のコードを実行します.
mysql> lock table `cat` READ;
Query OK, 0 rows affected

mysql> SELECT * FROM `cat` WHERE 1;
+----+--------+
| id | remark |
+----+--------+
|  1 | ceshi  |
|  2 | 22222  |
|  3 | 33333  |
+----+--------+
3 rows in set

mysql> UPDATE `cat` SET remark= 'Navicat' WHERE id=1;
1099 - Table 'cat' was locked with a READ lock and can't be updated

SQLyogで実行
mysql> SELECT * FROM `cat` WHERE 1;
+----+--------+
| id | remark |
+----+--------+
|  1 | ceshi  |
|  2 | 22222  |
|  3 | 33333  |
+----+--------+
3 rows in set mysql> UPDATE `cat` SET remark
= 'SQLyog' WHERE id=1

SQLyogがUPDATEを実行するときは、常に実行中です.ロックを解除すると、実行に成功します.
Navicatでのロック解除操作
mysql> unlock tables;

実行後、SQLyogのUPDATEが正常に実行されました.
テスト結果:
リードロックを行う場合、ロックスレッドはクエリー操作、書き込み操作を行うことができません.他のスレッドはクエリー操作、書き込み操作はできません.
 
テスト1:書き込みロック.説明:現在のスレッドのみがテーブルに書き込むことができます(他のスレッドもこのデータを読めません)
Navicatで次のコードを実行します.
mysql> LOCK TABLE cat WRITE;
Query OK, 0 rows affected

mysql> select * from `cat` where 1;
+----+--------+
| id | remark |
+----+--------+
|  1 | SQLyog |
|  2 | 22222  |
|  3 | 33333  |
+----+--------+
3 rows in set

mysql> update `cat` set remark= 'Navicat' where id=1;
Query OK, 1 row affected
Rows matched: 1  Changed: 1  Warnings: 0

そしてSQLyogで実行
mysql> select * from `cat` where 1;

および
mysql> update `cat` set remark= 'Navicat' where id=1;

すべてが常に実行状態であることがわかります.SQLyogは、ロック解除後のみ正常に実行されます.
Navicatでのロック解除操作
mysql> unlock tables;

SQLyogの実行に成功しました.
テスト結果:
書き込みロック後、書き込みロックを実行するスレッドは読み取りと書き込みが可能で、他のスレッドは読み取りと書き込みができません.