自分でREADロックを明示的にかけたテーブルに対して、データ追加、更新処理を行うと
エラー(ERROR 1099)が返ってくる。他のユーザーがREADロック
かけているテーブルに対して、データ追加、更新処理を行うとロック待ちになって
タイムアウトまで待ち続けます。

mysql> desc TABLE007;
+———+——————+——+—–+———+—————-+
| Field   | Type             | Null | Key | Default | Extra          |
+———+——————+——+—–+———+—————-+
| id      | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| comment | varchar(45)      | NO   |     | NULL    |                |
+———+——————+——+—–+———+—————-+
2 rows in set (0.00 sec)

mysql>

mysql> LOCK TABLES TABLE007 READ;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO TABLE007(comment) VALUES(‘READ LOCK BY MYSELF’);
ERROR 1099 (HY000): Table ‘TABLE007’ was locked with a READ lock and can’t be up
dated
mysql> SELECT COUNT(*) FROM TABLE007;
+———-+
| COUNT(*) |
+———-+
|        4 |
+———-+
1 row in set (0.00 sec)

mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO TABLE007(comment) VALUES(‘READ LOCK BY MYSELF’);
Query OK, 1 row affected (0.02 sec)

mysql>

==============================検証その1=================================

【自分でロックしている場合】

lock_read_mysql
※ すぐにエラーコードが返ってくる。

【自分のロック解除した場合】

lock_read_mysql_unlock

==============================検証その2=================================

【他のユーザーがロックしている場合】

lock_read_mysql_others
※ ロックが解除されるまで待ち続ける

【他のユーザーがロックしていたテーブルのロックを解除した場合】

lock_read_mysql_others_answer1

【memo】
━ 1 ━
ロックをかけているユーザーが他のテーブルをロックかけた場合は、前にかけていた
ロックは解除される。同時に複数のテーブルを同時にロックするには以下のように
複数テーブルを同時にロックをかける。

LOCK TABLES TABLE007 READ,TABLE008 READ;

━ 2 ━
READロックは他のSELECTステートメントをブロックしない。

Comments are closed.

Post Navigation