LOCK TABLES
によってテーブルを明示的にロックする場合は、トリガーで使用されているテーブルもすべて暗黙的にロックされます。
これらのロックは、LOCK
TABLES
ステートメントによって明示的に取得されるロックと同時に取得されます。
トリガーで使用されているテーブルに対するロックは、そのテーブルが読み取りのみに使用されているかどうかによって異なります。 読み取りのみに使用されている場合は、読み取りロックで十分です。 そうでない場合は、書き込みロックが使用されます。
テーブルが LOCK
TABLES
によって読み取りに対して明示的にロックされているが、トリガー内で変更される可能性があるために書き込みに対してロックする必要がある場合は、読み取りロックではなく書き込みロックが取得されます。(つまり、トリガー内でのテーブルの表示のために必要な暗黙の書き込みロックによって、テーブルに対する明示的な読み取りロック要求が書き込みロック要求に変換されます。)
このステートメントを使用して、2
つのテーブル t1
と
t2
をロックするとします。
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
ステートメントの結果として、t1
と t2
は、このステートメントに現れるためにロックされます。また、t3
と t4
は、トリガー内で使用されているためにロックされます。
t1
は、WRITE
ロック要求ごとに、書き込みに対してロックされます。
t2
は、要求が
READ
ロックに対するものであったとしても、書き込みに対してロックされます。これは、トリガー内で
t2
に挿入されるために発生します。したがって、READ
要求は WRITE
要求に変換されます。
t3
は、トリガー内から読み取られるだけであるため、読み取りに対してロックされます。
t4
は、トリガー内で更新される可能性があるため、書き込みに対してロックされます。