• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 7. 백업 및 복구
  • 8. 최적화
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 1. 데이터 정의 문
    2. 데이터 조작 문
    3. MySQL 트랜잭션과 잠금 문
    1. START TRANSACTION, COMMIT 및 ROLLBACK 구문
    2. 롤백 할 수없는 문
    3. 암시 적 커밋을 발생시키는 문
    4. SAVEPOINT, ROLLBACK TO SAVEPOINT 및 RELEASE SAVEPOINT 구문
    5. LOCK TABLES 및 UNLOCK TABLES 구문
    1. 테이블 잠금과 트랜잭션의 통신
    2. LOCK TABLES 및 트리거
    3. 테이블 잠금의 제한 및 조건
    6. SET TRANSACTION 구문
    7. XA 트랜잭션
    4. 복제 문
    5. Prepared Statements위한 SQL 구문
    6. MySQL 복합문 구문
    7. 데이터베이스 관리 문
    8. MySQL 유틸리티 문
  • 14. InnoDB 스토리지 엔진
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 28. MySQL 5.7 새로운 기능

13.3.5 LOCK TABLES 및 UNLOCK TABLES 구문

13.3.5.1 테이블 잠금과 트랜잭션의 통신
13.3.5.2 LOCK TABLES 및 트리거
13.3.5.3 테이블 잠금의 제한 및 조건
LOCK TABLES
    tbl_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 는 다음과 같이 잠금을 가져옵니다.

  1. 잠금되는 모든 테이블을 내부에서 정의 된 순서로 정렬합니다. 사용자로 볼 때이 순서는 정의되어 있지 않습니다.

  2. 테이블을 읽기 및 쓰기 잠금 잠금하려면 쓰기 잠금 요청을 읽기 잠금 요청 ​​전에 배치합니다.

  3. 세션이 잠금을 얻을 때까지 한 번에 하나의 테이블을 잠급니다.

이 정책은 테이블 잠금 교착 상태가 발생하지 않는 것이 보증됩니다.

참고

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 조작을 시도하면 오류 「Table 'tbl_name' was not locked with LOCK TABLES」 가 발생할 수 있습니다. 이를 해결하려면 두 번째 변경하기 전에 테이블을 다시 잠급니다. 섹션 B.5.7.1 "ALTER TABLE의 문제" 를 참조하십시오.


서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved