MySQL LOCK TABLES 명령어로 여러 테이블 잠그기
MySQL에서는 LOCK TABLES 명령어를 사용하여 하나 이상의 테이블에 락(Lock)을 걸 수 있습니다. 기본 문법은 다음과 같습니다.
LOCK TABLES yourTableName1 WRITE;
LOCK TABLES yourTableName2 WRITE;
LOCK TABLES yourTableName3 WRITE;
LOCK TABLES yourTableName4 WRITE;
.
.
.
N;
주의사항: 트랜잭션 안전성
테이블 락은 트랜잭션에 안전하지 않습니다. 두 번째 테이블을 잠그려고 시도하기 전에, 현재 진행 중인 활성 트랜잭션이 먼저 암시적으로 커밋(Commit)된다는 점을 반드시 기억해야 합니다.
실습 예제: 테이블 생성 및 잠금
먼저 실습용으로 OrderDemo라는 테이블을 생성해 보겠습니다.
mysql> create table OrderDemo
-> (
-> OrderId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> OrderPrice int,
-> OrderDatetime datetime
-> );
Query OK, 0 rows affected (0.66 sec)
이제 OrderDemo 테이블과 utfdemo 테이블(샘플 데이터베이스에 이미 존재하는 테이블)을 각각 잠그는 쿼리입니다.
mysql> LOCK TABLES OrderDemo WRITE;
Query OK, 0 rows affected (0.03 sec)
mysql> LOCK TABLES utfdemo WRITE;
Query OK, 0 rows affected (0.07 sec)
락 상태에서 발생하는 오류
테이블이 잠기면 해당 세션에서는 잠긴 테이블만 접근할 수 있습니다. 따라서 새로운 테이블을 생성하려고 하면 다음과 같은 오류가 발생합니다.
mysql> create table LockTableDemo
-> (
-> UserId int,
-> UserName varchar(10)
-> );
ERROR 1100 (HY000): Table 'LockTableDemo' was not locked with LOCK TABLES
mysql> create table UserIformation
-> (
-> UserId int,
-> UserName varchar(10)
-> );
ERROR 1100 (HY000): Table 'UserIformation' was not locked with LOCK TABLES
오류 해결 방법
위와 같은 오류(ERROR 1100)가 발생하면 MySQL 서버를 재시작해야 정상적으로 작업을 계속할 수 있습니다. 또는 세션에서 UNLOCK TABLES 명령을 실행하여 락을 해제한 후 작업하는 것도 좋은 방법입니다.