[前][次][番号順一覧][スレッド一覧]

mysql:11217

From: Hirokazu Aoyama <Hirokazu Aoyama <aoyama@xxxxxxxxxx>>
Date: Sun, 20 Mar 2005 17:01:44 +0900
Subject: [mysql 11217] Re: 4.1.1と3.23.58での違い

こんにちは、青山と申します。

> 1100: Table 'tempid' was not locked with LOCK TABLES
> と出ました。insert処理の前に他のテーブルをロックし、insert後にこのロックを解除ていたのですが、これが問題だった様です。
> 他のテーブルをロックした場合、insert処理対象のテーブルもロックしなくてはならないのでしょうか?
> 初歩的なことばかりですみません。

MySQLのマニュアルのLOCK TABLESのところを読むと、

「LOCK TABLES の使用時には、使用するテーブルをすべてロックし、
  またクエリで使用するエイリアスと同じ名前を使用する必要があります。
  1 つのクエリで同じテーブルを何度も指定する(エイリアスを使用して)
  場合は、各エイリアスに対してロックを取得しなければなりません。」

とあります。
「使用する全てのテーブルをロック」しなければならない仕様のようです。

上記のように個々のエイリアスがロック対象となるので、例えば

INSERT INTO table1 〜;
SELECT 〜 FROM table1 x, table2 y;

という2つのクエリーを発行する場合は、

LOCK TABLES table1 WRITE, 
            table1 AS x WRITE,
            table2 AS y WRITE;

のように、一つのテーブルでも複数のロックを発行する必要がある
ケースがあります。

また、エイリアスは一意に決まっている必要があり、

LOCK TABLES table1 WRITE, 
            table1 AS x WRITE,
            table2 AS y WRITE,
            table3 AS y WRITE;  ==> テーブルは異なるがエイリアスyが重複

というロックはかけられません。

そのため、SQL文を作る場合には、テーブル名と1対1に対応する
エイリアス名を予め決めておかないといけないようです。(ちょっと面倒)


-- 
Hirokazu Aoyama <aoyama@xxxxxxxxxx>


[前][次][番号順一覧][スレッド一覧]

     11209 2005-03-19 22:41 [荒木 満 <araki@xxxx] 4.1.1と3.23.58での違い                  
     11210 2005-03-19 23:34 ┗[kiseki <ml@xxxxxxxxx]                                       
     11211 2005-03-19 23:58  ┗[kiseki <ml@xxxxxxxxx]                                     
     11212 2005-03-19 23:57   ┗[荒木 満 <araki@xxxx]                                   
     11213 2005-03-20 00:56    ┗[kiseki <ml@xxxxxxxxx]                                 
     11214 2005-03-20 09:19     ┗[荒木 満 <araki@xxxx]                               
     11215 2005-03-20 10:06      ┗[Tadashi Jokagi <ml@x]                             
     11216 2005-03-20 10:25       ┗[荒木 満 <araki@xxxx]                           
->   11217 2005-03-20 17:01        ┗[Hirokazu Aoyama <aoy]                         
     11221 2005-03-21 00:26         ┗[荒木 満 <araki@xxxx]