13.3.5 LOCK TABLES 및 UNLOCK TABLES 구문
LOCK TABLEStbl_name
[[AS]alias
]lock_type
[,tbl_name
[[AS]alias
]lock_type
] ...lock_type
: READ [LOCAL] | [LOW_PRIORITY] WRITE UNLOCK TABLES
MySQL은 클라이언트 세션이 다른 세션과 연계하여 테이블에 액세스하기 위해 또는 세션 테이블에 대한 단독 액세스가 필요한 기간 동안 다른 세션에 의해 그 테이블이 변경되지 않도록하기 위해 명시 적으로 테이블 잠금을 얻을 수 있습니다. 세션이 락을 취득 또는 해제 할 수있는 것은 그 자체만을위한 것입니다. 세션이 다른 세션에 대한 잠금을 얻거나 다른 세션에 의해 유지되는 잠금을 해제 할 수 없습니다.
잠금을 사용하면 트랜잭션을 에뮬레이트하거나 테이블 업데이트시 속도를 향상시킬 수 있습니다. 이 내용은이 섹션의 나머지 분에 자세히 설명되어 있습니다.
LOCK TABLES
는 현재 클라이언트 세션 테이블 잠금을 명시 적으로 가져옵니다. 테이블 잠금은 기본 테이블 또는 뷰에 대해 얻을 수 있습니다. 잠금되는 각 개체에 대한 LOCK TABLES
권한과 SELECT
권한이 필요합니다.
뷰 잠금 경우 LOCK TABLES
는 뷰에서 사용되는 모든 기본 테이블을 잠금하는 테이블 세트에 추가하고 테이블을 자동으로 잠급니다. 섹션 13.3.5.2 "LOCK TABLES와 트리거" 에 설명 된대로 LOCK TABLES
에 의해 명시 적으로 테이블을 잠근 경우 트리거에서 사용되는 테이블도 모두 암묵적으로 잠겨 있습니다.
UNLOCK TABLES
는 현재 세션에 의해 유지되는 테이블 잠금을 명시 적으로 해제합니다. LOCK TABLES
는 새로운 락을 취득하기 전에 현재의 세션에 의해 유지되는 테이블 락을 모두 암묵적으로 해제합니다.
UNLOCK TABLES
의 다른 용도로 모든 데이터베이스의 모든 테이블을 잠글 수 FLUSH TABLES WITH READ LOCK
문으로 확보 된 글로벌 읽기 잠금의 해제가 있습니다. 섹션 13.7.6.3 "FLUSH 구문" 을 참조하십시오. (이것은 특정 시점의 스냅 샷을 할 수있는 Veritas 등의 파일 시스템이있는 경우에는 백업을 얻을 수있는 매우 유용한 방법입니다.)
테이블 잠금은 다른 세션의 부적절한 읽거나 쓸에서만 보호됩니다. WRITE
잠금을 보유하고있는 세션은 DROP TABLE
이나 TRUNCATE TABLE
등의 테이블 수준의 작업을 수행 할 수 있습니다. READ
잠금을 보유하고있는 세션의 경우 DROP TABLE
및 TRUNCATE TABLE
작업이 허용되지 않습니다. TRUNCATE TABLE
작업은 트랜잭션 안전하지 않기 때문에 세션이 활성 트랜잭션 중 또는 READ
잠금을 보유하는 동안이 작업을 수행하려고하면 오류가 발생합니다.
다음의 설명은 TEMPORARY
테이블이 아닌에만 적용됩니다. LOCK TABLES
는 TEMPORARY
테이블에 허용됩니다 (단, 무시됩니다). 테이블은 다른 어떤 잠금이 활성화되어 있는지에 관계없이 그 테이블이 생성 된 세션에서 자유롭게 사용할 수 있습니다. 다른 어떤 세션도 그 테이블을 참조 할 수 없기 때문에 잠금이 필요하지 않습니다.
LOCK TABLES
의 사용과 관련된 기타 조건이나 LOCK TABLES
이 활성화되어있는 동안은 사용할 수없는 문은 섹션 13.3.5.3 "테이블 잠금의 제한 및 조건" 을 참조하십시오.
락 취득의 규칙
현재 세션에서 테이블 락을 취득하려면 LOCK TABLES
문을 사용합니다. 다음 잠금 유형을 사용할 수 있습니다.
READ [LOCAL]
잠금 :
이 잠금을 보유하고있는 세션 테이블을 읽을 수 있습니다 (그러나 쓰기는 할 수 없습니다).
여러 세션이 동시에 테이블에 대한
READ
락을 취득 할 수 있습니다.다른 세션은
READ
잠금을 명시 적으로 취득하지 않고 테이블을 읽을 수 있습니다.LOCAL
수식을 사용하면 잠금이 유지되는 동안 다른 세션에 의한 충돌하지 않는INSERT
문 (병렬 삽입)을 실행할 수 있습니다. ( 섹션 8.10.3 "동시 삽입" 을 참조하십시오.) 그러나 잠금을 보유하는 동안 서버 외부의 프로세스를 사용하여 데이터베이스를 조작하려고하는 경우는READ LOCAL
을 사용할 수 없습니다 .InnoDB
테이블의 경우,READ LOCAL
은READ
와 같습니다.
[LOW_PRIORITY] WRITE
잠금 :
이 잠금을 보유하고있는 세션은 테이블의 읽기 및 쓰기가 가능합니다.
이 잠금을 보유하고있는 세션 만이 테이블에 액세스 할 수 있습니다. 잠금이 해제 될 때까지 다른 어떤 세션 액세스 할 수 없습니다.
WRITE
잠금이 유지되는 동안 테이블에 대한 다른 세션에서 잠금 요청이 차단됩니다.LOW_PRIORITY
수식은 아무런 효과도 없습니다. 이전 버전의 MySQL에서는 잠금 동작에 영향을했지만, 이것은 사실이 아닌 있습니다. MySQL 5.6.5의 시점에서 이것은 비추천이며, 사용하면 경고가 생성됩니다. 대신LOW_PRIORITY
없는WRITE
를 사용하십시오.
LOCK TABLES
문이 하나의 테이블에 대한 다른 세션에 의해 유지되는 잠금을 위해 대기 할 필요가있는 경우,이 문은 모든 락을 취득 할 때까지 블록됩니다.
잠금이 필요한 세션은 필요한 모든 잠금을 1 개의 LOCK TABLES
문으로 취득해야합니다. 이렇게 획득 한 잠금이 유지되는 동안이 세션은 잠긴 테이블에 액세스 할 수 있습니다. 예를 들어, 다음 명령문 시퀀스는 t2
가 LOCK TABLES
문으로 잠겨 있지 않기 때문에이 테이블에 액세스하려고하면 오류가 발생합니다.
mysql>LOCK TABLES t1 READ;
mysql>SELECT COUNT(*) FROM t1;
+----------+ | COUNT(*) | +----------+ | 3 | +----------+ mysql>SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
INFORMATION_SCHEMA
데이터베이스의 테이블은 예외입니다. 이 테이블은 세션이 LOCK TABLES
에 의해 취득 된 테이블 잠금을 보유하고있는 동안에도 명시 적으로 잠글 수없이 액세스 할 수 있습니다.
잠긴 테이블을 같은 이름을 사용하여 하나의 쿼리에서 여러 번 참조 할 수 없습니다. 대신 별칭을 사용하여 테이블과 각 별칭에 대해 별도의 잠금을 가져옵니다.
mysql>LOCK TABLE t WRITE, t AS t1 READ;
mysql>INSERT INTO t SELECT * FROM t;
ERROR 1100 : Table 't'was not locked with LOCK TABLES mysql>INSERT INTO t SELECT * FROM t AS t1;
첫 번째 INSERT
는 잠긴 테이블에 같은 이름에 대한 참조가 2 개 존재하기 때문에 오류가 발생합니다.두 번째 INSERT
테이블에 대한 참조로 다른 이름이 사용되기 때문에 성공합니다.
문이 별칭을 사용하여 테이블을 참조하는 경우는 그 같은 별칭을 사용하여 테이블을 잠글 필요가 있습니다. 별칭을 지정하지 않고 테이블을 잠글 수 없습니다.
mysql>LOCK TABLE t READ;
mysql>SELECT * FROM t AS myalias;
ERROR 1100 : Table 'myalias'was not locked with LOCK TABLES
반대로 별칭을 사용하여 테이블을 잠글 경우 문에서 별칭을 사용하여 테이블을 참조해야합니다.
mysql>LOCK TABLE t AS myalias READ;
mysql>SELECT * FROM t;
ERROR 1100 : Table 't'was not locked with LOCK TABLES mysql>SELECT * FROM t AS myalias;
WRITE
잠금은 일반적으로 업데이트가 가능한 빨리 처리되도록 READ
잠금보다 높은 우선 순위를 가지고 있습니다. 즉, 세션이 READ
락을 취득한 뒤 다른 세션이 WRITE
잠금을 요청하는 경우는 WRITE
락을 요구 한 세션이 락을 취득 해 해제 할 때까지 이후의 READ
잠금 요청이 기다리게됩니다.
LOCK TABLES
는 다음과 같이 잠금을 가져옵니다.
잠금되는 모든 테이블을 내부에서 정의 된 순서로 정렬합니다. 사용자로 볼 때이 순서는 정의되어 있지 않습니다.
테이블을 읽기 및 쓰기 잠금 잠금하려면 쓰기 잠금 요청을 읽기 잠금 요청 전에 배치합니다.
세션이 잠금을 얻을 때까지 한 번에 하나의 테이블을 잠급니다.
이 정책은 테이블 잠금 교착 상태가 발생하지 않는 것이 보증됩니다.
LOCK TABLES
또는 UNLOCK TABLES
는 파티션 된 테이블에 적용된 경우 항상 전체 테이블을 잠 그거나 잠금 해제합니다. 이 문은 파티션 잠금 가지 치기를 지원하지 않습니다. 섹션 19.6.4 "파티셔닝 및 잠금" 을 참조하십시오.
잠금 해제 규칙
세션이 유지되는 테이블 잠금이 해제되는 경우, 모든 테이블 잠금을 한 번에 해제됩니다. 세션은 명시 적으로 잠금을 해제 할 수 있습니다. 또한 특정 상황에서 잠금이 묵시적으로 해제되는 경우도 있습니다.
세션은
UNLOCK TABLES
에 의해 명시 적으로 잠금을 해제 할 수 있습니다.세션이 이미 잠금을 보유하는 동안 잠금을 얻기 위해
LOCK TABLES
문을 발행 한 경우 새 잠금이 부여되기 전에 그 기존의 잠금이 묵시적으로 해제됩니다.세션 (예를 들어,
START TRANSACTION
으로) 트랜잭션을 시작하면 암시 적UNLOCK TABLES
를 실행하고 기존의 잠금이 해제됩니다. (테이블 잠금과 트랜잭션 간의 통신의 자세한 내용은 섹션 13.3.5.1 "테이블 잠금과 트랜잭션의 통신" 을 참조하십시오.)
클라이언트 세션의 연결이 (정상 및 비정상에 관계없이) 종료 된 경우, 서버는 그 세션에 의해 유지되고있는 모든 테이블 잠금 (트랜잭션 및 비 트랜잭션)을 암묵적으로 해제합니다. 클라이언트가 다시 연결하면 잠금이 유효하지 않습니다. 또한 클라이언트에 활성 트랜잭션이있는 경우, 서버는 연결을 끊을 때 트랜잭션을 롤백하고 다시 연결을 시도하는 경우는 자동 위탁이 활성화 된 상태에서 새로운 세션이 시작됩니다. 따라서 클라이언트는 자동 재 연결을 해제 할 수 필요할 수 있습니다. 자동 재 연결이 활성화 된 경우 다시 연결을 시도하는 동안 클라이언트에 통지되지 않지만 모든 테이블 잠금 또는 현재 트랜잭션이 손실됩니다. 자동 재 연결이 비활성화되어있는 경우 연결이 제거되면 발행 된 다음 문에 오류가 발생합니다. 클라이언트는 그 오류를 감지하고 잠금을 다시 취득이나 트랜잭션을 다시 실행 등의 적절한 조치를 취할 수 있습니다. 섹션 23.8.16 "자동 재 연결 동작 제어" 를 참조하십시오.
잠긴 테이블에서 ALTER TABLE
을 사용하여 테이블 잠금이 해제되는 경우가 있습니다. 예를 들어, 두 번째 ALTER TABLE
조작을 시도하면 오류 「
가 발생할 수 있습니다. 이를 해결하려면 두 번째 변경하기 전에 테이블을 다시 잠급니다. 섹션 B.5.7.1 "ALTER TABLE의 문제" 를 참조하십시오.
」Table
'
tbl_name
' was not locked with LOCK
TABLES