MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLエラー1099(HY000)の原因と解決方法:READロックされたテーブルを更新するには

MySQLエラー1099(HY000)とは

MySQLでテーブルに対してLOCK TABLES ... READを実行して読み取りロックをかけた状態では、そのテーブルへのINSERTUPDATEなどの更新操作を行うことができません。この状態で更新を試みると、「ERROR 1099 (HY000): Table 'xxx' was locked with a READ lock and can't be updated」というエラーが発生します。

このエラーを解消するには、UNLOCK TABLESステートメントを使ってロックを解除する必要があります。以下に、実際の動作を例とともに確認していきましょう。

1. テーブルを作成する

まず、サンプル用のテーブルを作成します。

mysql> create table demo6
-> (
-> country_name varchar(100)
-> );
Query OK, 0 rows affected (1.51 sec)

2. レコードを挿入する

INSERTコマンドを使って、いくつかのレコードを追加します。

mysql> insert into demo6 values('US');
Query OK, 1 row affected (0.11 sec)

mysql> insert into demo6 values('UK');
Query OK, 1 row affected (0.08 sec)

mysql> insert into demo6 values('AUS');
Query OK, 1 row affected (0.11 sec)

3. テーブルの内容を確認する

SELECT文で登録済みのレコードを表示してみましょう。

mysql> select * from demo6;

実行結果は以下の通りです。

+--------------+
| country_name |
+--------------+
| US |
| UK |
| AUS |
+--------------+
3 rows in set (0.00 sec)

4. 読み取りロック(READロック)をかける

次に、このテーブルに対して読み取り専用のロックを設定します。

mysql> lock tables demo6 read;
Query OK, 0 rows affected (0.00 sec)

5. ロック中に挿入を試みるとエラーが発生する

READロックがかかった状態でレコードを挿入しようとすると、以下のようなエラーが出力されます。

mysql> insert into demo6 values('IND');
ERROR 1099 (HY000): Table 'demo6' was locked with a READ lock and can't be updated

これが本記事で扱っている「エラー1099」です。READロック中のテーブルは参照のみ可能で、更新操作は一切受け付けられません。

6. UNLOCK TABLESでロックを解除する

エラーを回避して再度挿入できるようにするには、UNLOCK TABLESを実行してロックを解除します。

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

7. ロック解除後に再度挿入する

ロック解除後は、同じテーブルに問題なくレコードを挿入できます。

mysql> insert into demo6 values('IND');
Query OK, 1 row affected (0.09 sec)

もう一度SELECT文で内容を確認してみましょう。

mysql> select * from demo6;

実行結果は以下の通りです。

+--------------+
| country_name |
+--------------+
| US |
| UK |
| AUS |
| IND |
+--------------+
4 rows in set (0.00 sec)

まとめ

MySQLの「ERROR 1099 (HY000)」は、テーブルがREADロックされているために更新操作が拒否されることで発生します。LOCK TABLES ... READでロックしたテーブルを更新したい場合は、UNLOCK TABLESを実行してロックを解除してから操作を行いましょう。なお、セッションを終了してもロックは自動的に解放されるため、接続が切れた場合にも同様に更新が可能になります。

  1. Javaを使ってMySQLテーブルにレコードを挿入する方法

    はじめに本記事では、JavaのJDBC(Java Database Connectivity)を使用して、MySQLデータベースのテーブルにレコードを挿入する手順を解説します。まずテーブルを作成し、その後Javaプログラムからデータを登録するまでの一連の流れを見ていきましょう。1. MySQLでテーブルを作成するまず、データを挿入するためのテーブルを作成します。以下はMySQLでテーブルを作成するクエリです。mysql> create table DemoTable(   Id int,   Name varchar(30),&

  2. MySQLテーブルで先頭ゼロ付きの値を選択して挿入する方法

    MySQLで連番に先頭ゼロ(先行ゼロ)を付けた値をテーブルに挿入したい場合は、INSERT INTO SELECT文とLPAD()関数を組み合わせることで実現できます。LPAD()は文字列を指定した長さまで左側を特定の文字で埋める関数で、これを使えば「001」「002」のような形式のIDを簡単に生成できます。テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable1967 ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, UserId varchar(20)