13.3.5.3 테이블 잠금의 제한 및 조건
테이블 잠금을 대기하고있는 세션을 종료하기 위해 KILL
을 안전하게 사용할 수 있습니다. 섹션 13.7.6.4 "KILL"장 을 참조하십시오.
INSERT DELAYED
로 사용하는 테이블 잠금하지 마십시오. 삽입은 잠금을 보유하는 세션이 아니라 다른 스레드에 의해 처리 될 필요가 있기 때문에이 경우 INSERT DELAYED
오류가 발생합니다.
LOCK TABLES
및 UNLOCK TABLES
는 저장 프로그램에서 사용할 수 없습니다.
performance_schema
데이터베이스의 테이블은 setup_
테이블을 제외하고는 xxx
LOCK TABLES
는 잠글 수 없습니다.
LOCK TABLES
문이 활성화되어있는 동안 다음 문은 금지됩니다. CREATE TABLE
, CREATE TABLE ... LIKE
, CREATE VIEW
, DROP VIEW
및 저장 기능, 저장 프로 시저 이벤트에서 DDL 문.
일부 작업에서는 mysql
데이터베이스의 시스템 테이블에 액세스해야합니다. 예를 들어, HELP
문에는 서버 측의 도움말 목차가 필요하며, 또한 CONVERT_TZ()
는 시간대 테이블의 읽기가 필요할 수 있습니다. 서버는 사용자가 명시 적으로 잠금 않아도 같이 필요에 따라 시스템 테이블을 읽기에 묵시적으로 잠급니다. 다음 테이블은 지금 설명한대로 처리됩니다.
mysql.help_category mysql.help_keyword mysql.help_relation mysql.help_topic mysql.proc mysql.time_zone mysql.time_zone_leap_second mysql.time_zone_name mysql.time_zone_transition mysql.time_zone_transition_type
이러한 테이블 중 하나에 대한 WRITE
잠금 LOCK TABLES
문에서 명시 적으로 설정하는 경우 해당 테이블이 잠겨 유일한 테이블이어야합니다. 다른 어떤 테이블도 같은 문은 잠글 수 없습니다.
하나의 UPDATE
문은 모든 원자이기 때문에 일반적으로 테이블을 잠글 필요가 없습니다. 현재 실행중인 SQL 문을 다른 어떤 세션도 막을 수 없습니다. 그러나 테이블 잠금에 의해 이점을 얻을 수있는 가능성이있는 경우가 몇 가지 있습니다.
일련의
MyISAM
테이블에 많은 작업을 수행하려고하는 경우는 사용하려고하는 테이블을 잠금하는 것이 훨씬 빠릅니다.MyISAM
테이블을 잠그면 MySQL은 잠긴 테이블의 키 캐시를UNLOCK TABLES
가 불려 갈 때까지 플래시하지 않기 때문에 그 테이블에 대한 삽입, 업데이트 또는 삭제가 가속화됩니다. 일반적으로 키 캐시는 각 SQL 문 후에 플래시됩니다.테이블 잠금의 단점은
READ
에 의해 잠겨 테이블을 어떤 세션도 갱신하지 못하고 (잠금을 보유하고있는 세션 포함) 잠금을 보유하고있는 세션을 제외하고WRITE
의해 잠긴 테이블에 어떤 세션 액세스 할 수없는 것입니다.비 트랜잭션 스토리지 엔진에 테이블을 사용하는 경우
SELECT
와UPDATE
사이에 테이블이 다른 세션에 의해 변경되지 않도록하려면LOCK TABLES
를 사용해야합니다. 다음 예제는 안전하게 수행하기 위해LOCK TABLES
이 필요합니다.LOCK TABLES trans READ, customer WRITE; SELECT SUM (value) FROM trans WHERE customer_id =
some_id
; UPDATE customer SET total_value =sum_from_previous_statement
WHERE customer_id =some_id
; UNLOCK TABLES;LOCK TABLES
를 사용하지 않는 경우는SELECT
문과UPDATE
문 실행 사이에 다른 세션에 의해trans
테이블에 새로운 행이 삽입 될 수 있습니다.
많은 경우 상대적 업데이트 ( UPDATE customer SET
) 또는 value
= value
+ new_value
LAST_INSERT_ID()
함수를 사용함으로써 LOCK TABLES
의 사용을 피할 수 있습니다. 섹션 1.8.2.3 "트랜잭션 및 원자 연산의 차이" 를 참조하십시오.
경우에 따라서는 사용자 수준의 권고 잠금 함수 GET_LOCK()
와 RELEASE_LOCK()
을 사용하여 테이블 잠금을 방지 할 수 있습니다. 고속화를 위해 이러한 잠금은 서버의 해시 테이블에 저장되어 pthread_mutex_lock()
와 pthread_mutex_unlock()
으로 구현됩니다. 섹션 12.18 "기타 함수" 를 참조하십시오.
잠금 정책의 자세한 내용은 섹션 8.10.1 "내부 잠금 방법" 을 참조하십시오.