MySQL에서는 동시 접근으로 인한 데이터 충돌을 방지하기 위해 특정 테이블을 잠그는 기능(LOCK TABLES)을 제공한다. 하지만 테이블을 잠그면 다른 세션에서는 해당 테이블을 수정하거나 읽을 수 없기 때문에 적절한 시점에서 UNLOCK TABLES 명령어를 사용하여 테이블 잠금을 해제해야 한다.

1. UNLOCK TABLES란?
UNLOCK TABLES는 MySQL에서 LOCK TABLES로 잠근 테이블의 잠금을 해제하는 명령어이다.
이를 실행하면 해당 테이블을 모든 사용자 및 세션이 다시 사용할 수 있도록 허용한다.
기본 구문
UNLOCK TABLES;
- UNLOCK TABLES; 명령어를 실행하면 현재 세션에서 잠금이 걸려 있던 모든 테이블의 잠금이 해제된다.
- 특정 테이블만 선택적으로 해제하는 기능은 없으며, 세션에서 잠근 모든 테이블이 한 번에 해제됨을 기억하자.
2. UNLOCK TABLES가 필요한 경우
다음과 같은 경우 UNLOCK TABLES를 사용해야 한다.
- LOCK TABLES 사용 후 테이블을 다른 세션에서 접근할 수 있도록 해제할 때
- 백업 작업을 위해 테이블을 잠근 후, 정상적인 서비스 운영을 재개할 때
- MyISAM 엔진에서 테이블을 잠근 후 데이터 수정이 끝났을 때
3. UNLOCK TABLES 사용 예제
예제 1: 테이블 잠금 후 해제하기
LOCK TABLES employees WRITE;
INSERT INTO employees (id, name, salary) VALUES (103, 'David', 5500);
UNLOCK TABLES;
- LOCK TABLES employees WRITE;를 실행하면 employees 테이블이 쓰기 전용으로 잠긴다.
- UNLOCK TABLES;를 실행하면 다른 세션에서 해당 테이블을 사용할 수 있도록 잠금이 해제된다.
예제 2: 다중 테이블 잠금 후 해제하기
LOCK TABLES employees WRITE, departments READ;
INSERT INTO employees (id, name, salary) VALUES (104, 'Emma', 6200);
SELECT * FROM departments;
UNLOCK TABLES;
- LOCK TABLES employees WRITE, departments READ;를 실행하면
employees 테이블은 쓰기 전용, departments 테이블은 읽기 전용으로 잠긴다. - UNLOCK TABLES;를 실행하면 두 개의 테이블 모두 잠금이 해제된다.
4. UNLOCK TABLES 실행 시 주의할 점
- LOCK TABLES 없이 UNLOCK TABLES를 실행해도 에러가 발생하지 않는다.
- 단, 아무런 효과도 없기 때문에 불필요한 실행을 방지해야 한다.
- UNLOCK TABLES는 현재 세션에서만 동작한다.
- 다른 세션에서 잠근 테이블을 해제할 수 없다.
- 테이블을 잠근 세션이 종료되면 자동으로 잠금이 해제된다.
- 트랜잭션과 LOCK TABLES는 함께 사용할 수 없다.
- LOCK TABLES를 실행하면 자동으로 현재 진행 중인 트랜잭션이 종료(commit)된다.
- 따라서 트랜잭션을 사용해야 하는 경우에는
SELECT ... FOR UPDATE 같은 행 단위 잠금 기능을 대신 사용해야 한다.
5. UNLOCK TABLES와 트랜잭션 비교
기능 비교 | UNLOCK TABLES | 트랜잭션 (COMMIT/ROLLBACK) |
적용 범위 | 테이블 단위 | 행(Row) 단위 |
사용 시점 | LOCK TABLES 실행 후 | BEGIN TRANSACTION 실행 후 |
동시 접근 제한 | 전체 테이블 | 선택된 행만 |
트랜잭션 지원 | 지원하지 않음 | 지원 |
- InnoDB에서 트랜잭션을 사용하는 경우에는 UNLOCK TABLES를 사용할 필요가 거의 없다.
- MyISAM에서는 테이블 단위 잠금만 지원하므로 UNLOCK TABLES가 필수적으로 사용될 수 있다.
6. UNLOCK TABLES가 자동으로 실행되는 경우
다음과 같은 상황에서는 명시적으로 UNLOCK TABLES를 실행하지 않아도 자동으로 잠금이 해제된다.
1). 세션이 종료될 때
- MySQL 클라이언트(예: mysql 콘솔)를 닫거나,
EXIT; 또는 QUIT; 명령어를 입력하면 자동으로 UNLOCK TABLES가 실행된다.
2). LOCK TABLES 없이 새로운 쿼리를 실행할 때
- LOCK TABLES 실행 후 다른 세션이 아닌 같은 세션에서 새로운 LOCK TABLES을 실행하면
기존 잠금이 자동으로 해제된다.
LOCK TABLES employees WRITE;
LOCK TABLES departments WRITE; -- 기존 employees 테이블 잠금이 자동 해제됨
7. UNLOCK TABLES를 대체할 수 있는 방법
트랜잭션을 지원하는 InnoDB에서는 LOCK TABLES 없이 SELECT ... FOR UPDATE를 사용할 수 있다.
예제 3: SELECT ... FOR UPDATE 사용 (InnoDB 전용)
START TRANSACTION;
SELECT * FROM employees WHERE id = 104 FOR UPDATE;
UPDATE employees SET salary = 7000 WHERE id = 104;
COMMIT;
- FOR UPDATE를 사용하면 해당 행(Row)만 잠그기 때문에 전체 테이블 잠금보다 성능이 뛰어나다.
8. 마무리
MySQL에서 LOCK TABLES를 사용하면 테이블을 특정 세션에서만 읽거나 수정할 수 있도록 제한할 수 있다.
하지만 LOCK TABLES를 사용한 후에는 반드시 UNLOCK TABLES를 실행하여 잠금을 해제해야 한다.
특히 MyISAM 엔진을 사용하는 경우 LOCK TABLES와 UNLOCK TABLES를 적절히 사용해야 한다.
하지만 InnoDB에서는 트랜잭션을 활용하여 보다 효율적인 행 단위 잠금을 수행하는 것이 좋다.
공식 가이드 문서
MySQL UNLOCK TABLES 공식 문서:
https://dev.mysql.com/doc/refman/8.0/en/unlock-tables.html
'DB' 카테고리의 다른 글
[MySQL] SHOW CREATE USER 완벽 가이드 사용법(계정 생성 정보 확인) (0) | 2025.04.02 |
---|---|
[MySQL] RESET PASSWORD 완벽 가이드 사용법(비밀번호 변경) (0) | 2025.04.02 |
[MySQL] SHOW PRIVILEGES 완벽 가이드 사용법(모든 권한 확인) (0) | 2025.04.02 |
[MySQL] LOCK TABLES 완벽 가이드 사용법(테이블 잠금) (0) | 2025.04.02 |
[MySQL] FLUSH PRIVILEGES 완벽 가이드 사용법(캐시 갱신) (0) | 2025.04.02 |
[MySQL] SHOW GRANTS 완벽 가이드 사용법(사용자 권한 확인) (0) | 2025.04.02 |
[MySQL] SET PASSWORD 완벽 가이드 사용법(비밀번호 변경) (0) | 2025.04.02 |
[MySQL] RENAME USER 완벽 가이드 사용법(사용자 계정명 변경) (0) | 2025.04.01 |