Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


13.3.5.2 LOCK TABLES とトリガー

LOCK TABLES によって明示的にテーブルをロックした場合は、トリガーで使用されているテーブルもすべて暗黙的にロックされます。

  • これらのロックは、LOCK TABLES ステートメントによって明示的に取得されるロックと同時に取得されます。

  • トリガーで使用されているテーブルに対するロックは、そのテーブルが読み取りのみに使用されているかどうかによって異なります。読み取りのみに使用されている場合は、読み取りロックで十分です。そうでない場合は、書き込みロックが使用されます。

  • テーブルが LOCK TABLES によって読み取りに対して明示的にロックされているが、トリガー内で変更される可能性があるために書き込みに対してロックする必要がある場合は、読み取りロックではなく書き込みロックが取得されます。(つまり、トリガー内でのテーブルの表示のために必要な暗黙の書き込みロックによって、テーブルに対する明示的な読み取りロック要求が書き込みロック要求に変換されます。)

次のステートメントを使用して、2 つのテーブル t1t2 をロックするとします。

LOCK TABLES t1 WRITE, t2 READ;

t1 または t2 にトリガーが含まれている場合は、そのトリガー内で使用されているテーブルもロックされます。t1 に、次のように定義されたトリガーが含まれているとします。

CREATE TRIGGER t1_a_ins AFTER INSERT ON t1 FOR EACH ROW
BEGIN
  UPDATE t4 SET count = count+1
      WHERE id = NEW.id AND EXISTS (SELECT a FROM t3);
  INSERT INTO t2 VALUES(1, 2);
END;

LOCK TABLES ステートメントの結果として、t1t2 は、このステートメントに現れるためにロックされます。また、t3t4 は、トリガー内で使用されているためにロックされます。

  • t1 は、WRITE ロック要求ごとに、書き込みに対してロックされます。

  • t2 は、要求が READ ロックに対するものであったとしても、書き込みに対してロックされます。これは、トリガー内で t2 に挿入されるために発生します。したがって、READ 要求は WRITE 要求に変換されます。

  • t3 は、トリガー内から読み取られるだけであるため、読み取りに対してロックされます。

  • t4 は、トリガー内で更新される可能性があるため、書き込みに対してロックされます。