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
は、トリガー内で更新される可能性があるため、書き込みに対してロックされます。