13.3.5.1 테이블 잠금과 트랜잭션의 통신
LOCK TABLES 및 UNLOCK TABLES 는 트랜잭션의 사용 사이에서 다음과 같이 통신합니다.
LOCK TABLES는 트랜잭션 안전하지 않기 때문에 테이블을 잠그려고하기 전에 활성 트랜잭션을 암시 적으로 커밋합니다.UNLOCK TABLES는 활성 트랜잭션을 암시 적으로 노력하고 있지만 이것이 행해지는 테이블 잠금을 얻기 위해LOCK TABLES가 사용 된 경우입니다. 예를 들어 다음과 같은 일련의 문은UNLOCK TABLES가 글로벌 읽기 잠금 해제되지만 유효한 테이블 잠금이 없기 때문에 트랜잭션은 커밋되지 않습니다.FLUSH TABLES WITH READ LOCK; START TRANSACTION; SELECT ...; UNLOCK TABLES;
트랜잭션 (예를 들어,
START TRANSACTION에서) 시작하면 현재 트랜잭션이 암시 적으로 커밋 된 기존 테이블 잠금이 해제됩니다.FLUSH TABLES WITH READ LOCK은 글로벌 읽기 잠금을 가져 오지만 테이블 잠금은 검색하지 않기 때문에 테이블 잠금과 암묵적인 위탁에 관해서LOCK TABLES와UNLOCK TABLES와 같은 동작을 따르지 않습니다. 예를 들어,START TRANSACTION은 글로벌 읽기 잠금을 해제하지 않습니다. 섹션 13.7.6.3 "FLUSH 구문" 을 참조하십시오.암시 적 트랜잭션 커밋을 발생시키는 다른 문은 기존 테이블 잠금을 해제하지 않습니다. 이러한 문 목록은 섹션 13.3.3 "암시 적 커밋을 발생시키는 문" 을 참조하십시오.
트랜잭션 테이블 (
InnoDB테이블 등)에LOCK TABLES및UNLOCK TABLES를 사용하는 올바른 방법은SET autocommit = 0(START TRANSACTION아님)에 이어LOCK TABLES를 지정하여 트랜잭션을 시작하고 트랜잭션을 명시 적으로 커밋 할 때까지UNLOCK TABLES를 호출하지 않는 것입니다. 예를 들어, 테이블t1에 쓰기 테이블t2에서 읽어야하는 경우에는 다음과 같이 실행할 수 있습니다.SET autocommit = 0; LOCK TABLES t1 WRITE, t2 READ ...;
... do something with tables t1 and t2 here ...COMMIT; UNLOCK TABLES;LOCK TABLES를 호출하면,InnoDB는 내부적으로 자신의 테이블 락을 취득 해, MySQL은 자신의 테이블 락을 취득합니다.InnoDB는 다음의 커밋시에 내부 테이블 잠금을 해제하지만, MySQL에서 테이블 잠금이 해제되도록하려면UNLOCK TABLES를 호출해야합니다.autocommit = 1을 지정하면LOCK TABLES의 호출 직후에InnoDB에 의해 내부 테이블 잠금이 해제되고 교착 상태가 매우 발생해질 수 있기 때문에이 지정하지 않도록하십시오.autocommit = 1이 지정된 경우 기존 응용 프로그램이 불필요한 교착 상태를 방지하는데 도움을주기 위해InnoDB는 내부 테이블 잠금을 전혀 취득하지 않습니다.ROLLBACK은 테이블 잠금을 해제하지 않습니다.