728x90

1. LOCK TABLE이란?
LOCK TABLE은 Oracle에서 하나 이상의 테이블에 대해 명시적으로 잠금을 설정하여 동시성 문제를 방지하는 SQL 문입니다. 이 명령은 주로 트랜잭션 처리 중 데이터 일관성과 충돌 방지를 위해 사용됩니다.
2. LOCK TABLE 기본 문법
LOCK TABLE 테이블명 IN [락 모드] MODE [NOWAIT | WAIT n];
락 모드 예시: ROW SHARE, ROW EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE
3. 자주 사용하는 LOCK 모드 설명
| LOCK 모드 | 설명 | 공용? | 주 용도 |
|---|---|---|---|
| ROW SHARE | 동시 읽기/쓰기 가능, SELECT ... FOR UPDATE와 유사 | 공용 | 트랜잭션 시작 알림 |
| ROW EXCLUSIVE | INSERT/UPDATE/DELETE 실행 시 자동 | 단독 | 행 변경 작업 |
| SHARE | 읽기 전용, 다른 공유 잠금 허용 | 공용 | 동시 조회 |
| SHARE ROW EXCLUSIVE | 공유 + 단독 권한, 다소 제한적 | 제한적 | 혼합 작업 |
| EXCLUSIVE | 읽기, 쓰기 모두 배제 | 단독 | 전체 테이블 독점 |
4. 실전 예제: 단일 테이블 잠금
LOCK TABLE employees IN ROW EXCLUSIVE MODE;
-- employees 테이블에 대해 다른 트랜잭션의 DML을 차단하지 않음
5. NOWAIT과 WAIT 옵션
LOCK TABLE employees IN EXCLUSIVE MODE NOWAIT;
NOWAIT: 잠금을 기다리지 않고 즉시 오류 반환
LOCK TABLE employees IN EXCLUSIVE MODE WAIT 10;
WAIT: 10초간 잠금 대기 후 실패 시 오류 반환
6. 여러 테이블 동시 잠금
LOCK TABLE employees, departments IN SHARE MODE;
여러 테이블을 동시에 잠금 처리 가능하며, 트랜잭션 단위로 유지됩니다.
7. LOCK TABLE과 트랜잭션 관계
LOCK TABLE 문은 COMMIT 또는 ROLLBACK이 발생할 때까지 유지됩니다. 따라서 잠금 후 트랜잭션 처리가 완료되어야 잠금이 해제됩니다.
8. 실무 활용 예: 대량 처리 시 충돌 방지
BEGIN
LOCK TABLE sales_data IN EXCLUSIVE MODE;
DELETE FROM sales_data WHERE sale_date < SYSDATE - 365;
COMMIT;
END;
/
오래된 판매 데이터를 삭제하기 전에 LOCK을 걸어 다른 트랜잭션과의 충돌을 방지합니다.
9. LOCK 상태 확인 방법
SELECT object_name, session_id, locked_mode
FROM v$locked_object a, dba_objects b
WHERE a.object_id = b.object_id;
현재 세션 및 객체별 LOCK 정보를 조회할 수 있습니다.
10. 주의사항
- 잠금 시간 과도 시 성능 저하 및 데드락 위험 존재
- 불필요한 EXCLUSIVE MODE 사용 자제
- 트랜잭션 커밋 누락 시 잠금 지속으로 장애 유발
- 분산 트랜잭션과 함께 사용할 경우 조심
11. LOCK 관련 시스템 뷰
DBA_BLOCKERS: 잠금을 유발하는 세션DBA_WAITERS: 잠금을 기다리는 세션V$LOCK: 모든 세션의 LOCK 정보DBA_DML_LOCKS: DML 관련 잠금 정보
12. 결론
Oracle의 LOCK TABLE은 동시성 제어, 데이터 일관성 보장, 트랜잭션 충돌 방지를 위한 핵심 도구입니다. 하지만 잘못 사용하면 시스템 병목과 데드락을 유발할 수 있으므로, 필요한 경우에만 신중히 적용하고 항상 트랜잭션과 함께 적절히 관리해야 합니다.
출처
- Oracle 공식 문서: https://docs.oracle.com/en/database/
- Oracle Database Concepts & PL/SQL - Steven Feuerstein 외
- 실무 중심 Oracle 트랜잭션과 동시성 관리 - 이현석 저
728x90
'Database > Oracle' 카테고리의 다른 글
| [ORACLE] USER() 계정 생성부터 권한 부여까지 실무 가이드 (0) | 2025.06.09 |
|---|---|
| [ORACLE] INDEX() 성능 향상을 위한 인덱스 종류와 예제 완전 정복 (0) | 2025.06.09 |
| [ORACLE] SYNONYM() 시노님 개념부터 생성 예제까지 완전 정복 (0) | 2025.06.09 |
| [ORACLE] VIEW() 가상 테이블로 복잡한 SQL을 단순하게 만드는 방법 (0) | 2025.06.09 |
| [ORACLE] SEQUENCE() 자동 증가 값 생성 원리와 실전 예제 완벽 정리 (0) | 2025.06.09 |