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
은 테이블 잠금을 해제하지 않습니다.