오라클에서 Lock(잠금)은 여러 사용자가 동시에 같은 데이터에 접근할 때 데이터의 무결성을 보장하고 경합을 방지하기 위해 적용되는 메커니즘입니다.
오라클 Lock은 크게 DML Lock, DDL Lock, System Lock, 그리고 Latch(래치) 및 내부 잠금 메커니즘으로 분류됩니다.
참고로, 오라클은 읽어올 때 최소단위가 Block단위이고, 한 블록에 여러 Row가 적재되어 있으므로, 한 Row에 Update를 하더라도, 같은 Block에 Lock이 걸리면 영향이 없는 Row도 수정할 수 없게 됩니다. 즉, Row Lock과 블록 Lock이 다르고, SGA영역의 각종 자료구조를 보호하기 위한 래치 Lock 등 여러 Lock들이 있습니다. Lock은 데이터베이스의 특징을 결정짓는 가장 핵심적인 매커니즘으로 반드시 공부해야 할 Area입니다. 자신이 사용하는 DBMS의 고유한 Lock 메커니즘을 이해하지 못한다면, 고품질, 고성능 애플리케이션 구축이 어려울 수 있습니다. SQLP 자격증을 취득하실 분들은 완벽하게 숙지하시는 것을 추천드립니다.
참고로 오라클은 다른 트랜잭션이 변경한 Row를 읽을 때 복사본 블럭을 만들어서 쿼리가 “시작된 시점”으로 되돌려서 읽습니다. 변경이 진행중인 (아직 Commit되지 않은) Row를 읽을 때에도 Lock이 풀릴때까지 기다리지 않고 복사본을 만들어서 읽으므로 Select문에는 Lock을 사용할 필요가 없습니다. 즉, 오라클은 DML과 Select는 서로 방해하지 않습니다.
1. 오라클 Lock의 주요 종류
① DML Lock (Data Manipulation Language Lock)
DML(INSERT, UPDATE, DELETE) 실행 시 발생하는 잠금으로, 데이터 무결성을 보호하고 동시 트랜잭션 충돌을 방지하는 역할을 합니다.
🙌 참고로 Insert에 대한 경합은 Unique 인덱스가 있을 때만 발생합니다.
DML Lock 종류 | 설명 | 예제 | 특징 |
---|---|---|---|
TX (Transaction Lock, 트랜잭션 락) | 트랜잭션이 실행될 때 발생하는 행(Row) 단위 잠금 | UPDATE employees SET salary = 5000 WHERE emp_id = 1; | – Row-Level Lock (행 단위) – Commit/Rollback 시 해제 |
TM (Table Lock, 테이블 락) | 특정 테이블에 대한 변경을 보호 | DELETE FROM employees WHERE dept_id = 10; | – 테이블 수준에서 동시 변경 방지 – 외래키 제약 조건 보호 |
② DDL Lock (Data Definition Language Lock)
DDL(ALTER, DROP, CREATE) 실행 시 발생하는 잠금으로, 테이블 등의 객체 구조를 보호하는 역할을 합니다.
🙌 참고로 DDL Lock은 오라클 문서 상 분류일 뿐이며, 실제로는 TM Lock(=DML 테이블 Lock), 라이브러 캐시 lock/Pin을 이용해 구현한 가상의 Lock입니다. “Dictionary Lock”이라고도 부르며, Exclusive DDL Lock, Share DDL Lock, (Breakable) Parse Lock 세가지가 있습니다.
즉, DDL Lock은 TM Lock, 라이브러리 캐시 Lock/Pin의 작용으로 나타나는 현상을 또 하나의 Lock으로 분류한 것으로 보시면 됩니다.
DDL Lock 종류 | 설명 | 예제 | 특징 |
---|---|---|---|
Exclusive DDL Lock | 특정 객체가 다른 트랜잭션에 의해 변경되지 않도록 보호 | ALTER TABLE employees ADD phone_number VARCHAR2(20); | – DDL 실행 중에는 DML & 다른 DDL 불가 – DDL 종료 시 자동 해제 |
Share DDL Lock | 여러 세션에서 읽기는 가능하지만 변경은 제한 | CREATE INDEX idx_emp ON employees(emp_id); | – SELECT 가능하지만, DROP은 불가 |
Breakable Parse Lock | 실행 중인 SQL이 객체 변경 시 오류 발생하지 않도록 보호 | ALTER TABLE employees RENAME TO emp_new; | – 변경 시 SQL 재컴파일 필요 |
③ System Lock (시스템 락)
오라클 내부적으로 데이터베이스의 성능과 무결성을 유지하기 위해 발생하는 잠금입니다.
System Lock 종류 | 설명 | 특징 |
---|---|---|
Library Cache Lock | SQL 실행 계획 및 PL/SQL 코드 보호 | – SQL & PL/SQL 실행 중 변경 방지 – 동시 컴파일 방지 |
Row Cache Lock (Data Dictionary Lock) | 데이터 딕셔너리 보호 | – DDL 실행 시 발생 – 객체의 메타데이터 보호 |
④ Latch Lock (래치 락)
Latch(래치)는 Lock보다 더 가볍고 빠른 동기화 메커니즘으로, 공유 메모리 구조를 보호하는 역할을 합니다.
CPU에서 빠르게 동작하며, 오라클 내부에서 Buffer Cache, Redo Log, Shared Pool 등의 자원을 보호하는 데 사용됩니다.
Latch 종류 | 설명 | 특징 |
---|---|---|
Redo Allocation Latch | Redo 로그를 할당할 때 보호 | – 트랜잭션 기록 성능 최적화 |
Shared Pool Latch | 공유 풀(SGA) 내에서 SQL 및 PL/SQL 캐시 보호 | – Library Cache와 연관 |
Buffer Cache Latch | 데이터 블록을 캐시에 올릴 때 보호 | – 경합이 심하면 성능 저하 가능 |
Checkpoint Queue Latch | 데이터 변경 내용을 디스크에 기록할 때 보호 | – Checkpoint 발생 시 제어 |
💡 Latch는 일반적인 Row-Level Lock이나 Table Lock보다 빠르게 처리되며, Spinlock 메커니즘을 사용하여 충돌을 방지합니다.
5. 오라클 Lock 종류 비교
Lock 종류 | 적용 대상 | 용도 | 특징 |
---|---|---|---|
DML Lock (TX, TM) | Row 또는 Table | DML 실행 시 데이터 보호 | Commit/Rollback 필요 |
DDL Lock | Table, Index 등 객체 | 객체 변경 충돌 방지 | DDL 실행 종료 후 자동 해제 |
System Lock | 오라클 내부 시스템 | 데이터 딕셔너리, 공유 메모리 보호 | 동시 실행 제어 |
Latch Lock | SGA, Buffer Cache 등 메모리 영역 | 공유 메모리 보호, 성능 최적화 | 매우 가벼운 잠금 |
6. 결론
📌 DML Lock (TX, TM) → 데이터 보호 (Commit/Rollback 필요)
📌 DDL Lock → 객체 구조 보호 (DDL 종료 시 자동 해제)
📌 System Lock → 데이터베이스 내부 보호
📌 Latch (래치) → 빠른 메모리 보호 & 성능 최적화
⚠ Tip:
- DML Lock(TX, TM)과 DDL Lock은 일반적인 데이터 변경과 구조 변경을 보호하는 역할
- System Lock과 Latch는 데이터베이스 내부 동작을 최적화하고 보호하는 역할
- Latch 경합이 발생하면 성능 저하 가능 → Wait Event 확인 필요 (
V$LATCH, V$SESSION_WAIT
활용)
🚀 오라클 락의 종류를 잘 이해하면, 성능 최적화와 동시성 문제 해결에 큰 도움이 됩니다!
덧붙여서!
DML 로우 Lock에 의한 성능 저하를 방지하려면, 온라인 트랜잭션을 처리하는 주간에 Lock을 필요 이상으로 오래 유지하지 않도록 커밋 시점을 조절해야 하는데, 그러려면 트랜젝션이 일을 빨리 끝내도록 SQL을 튜닝하는 것이 가장 좋다는 것입니다. 즉 SQL튜닝이 곳 Lock튜닝인 셈이라 할 수 있습니다. 하하 🤣