13.3.5.2 LOCK TABLES 및 트리거
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
는 트리거에서 업데이트 될 가능성이 있기 때문에 쓰기에 잠겨 있습니다.