본문 바로가기
Database

오라클에서 LOCK의 개념과 관리

by 굿센스굿 2024. 12. 4.
반응형

 

오라클 데이터베이스에서 **LOCK(잠금)**은 데이터의 무결성을 유지하고 동시에 여러 사용자가 데이터에 접근할 때 발생할 수 있는 충돌을 방지하기 위한 중요한 메커니즘입니다. 데이터베이스는 여러 사용자가 같은 데이터를 읽거나 수정하려고 시도할 때 경쟁 상태를 처리해야 합니다. 이때 LOCK은 트랜잭션 간의 충돌을 예방하고 데이터의 일관성을 보장하는 역할을 합니다.

이 글에서는 오라클 데이터베이스에서 LOCK의 개념, 종류, 작동 방식, 관리 방법을 알아보고, 세 가지 예시를 통해 실무에서 LOCK을 효율적으로 관리하는 방법을 설명합니다.


1. LOCK의 개념

LOCK은 데이터베이스 객체(테이블, 행 등)에 대해 트랜잭션이 독점적 또는 공유적으로 액세스할 수 있도록 제어하는 메커니즘입니다.

LOCK의 목적

  1. 데이터 무결성 유지: 여러 사용자가 동시에 데이터를 수정하려는 경우 충돌을 방지합니다.
  2. 데이터 일관성 보장: 트랜잭션이 완료되기 전에는 다른 트랜잭션이 해당 데이터를 수정하지 못하도록 합니다.
  3. 동시성 제어: 다중 사용자 환경에서 성능 저하 없이 동시 작업을 가능하게 합니다.

2. LOCK의 종류

오라클에서는 LOCK을 크게 두 가지로 나눌 수 있습니다:

2.1 DML LOCK (Data Manipulation Language Lock)

DML LOCK은 데이터 조작 언어(INSERT, UPDATE, DELETE)가 실행될 때 자동으로 설정됩니다.

  • ROW LEVEL LOCK (행 단위 잠금): 특정 행에 대해 LOCK을 설정하여 다른 사용자가 해당 행을 수정하지 못하도록 합니다.
  • TABLE LEVEL LOCK (테이블 단위 잠금): 전체 테이블에 LOCK을 설정하여 다른 트랜잭션의 DML 작업을 제한합니다.

2.2 DDL LOCK (Data Definition Language Lock)

DDL LOCK은 데이터 정의 언어(CREATE, ALTER, DROP 등)가 실행될 때 설정됩니다.

  • DDL 작업 중 데이터 구조가 변경되는 것을 방지합니다.

2.3 SYSTEM LOCK

SYSTEM LOCK은 데이터베이스의 내부 메커니즘으로, 데이터베이스의 객체 및 리소스에 대한 잠금을 관리합니다.

  • 예: Library Cache Lock, Row Cache Lock 등

3. LOCK의 작동 방식

오라클에서 LOCK은 두 트랜잭션이 동일한 리소스에 대해 동시에 충돌하는 경우에 작동합니다.

  • 한 트랜잭션이 데이터를 수정하려고 하면 해당 리소스에 LOCK이 설정됩니다.
  • 다른 트랜잭션은 이 리소스를 사용할 수 없으며, 대기 상태로 전환됩니다.

오라클은 기본적으로 잠금 대기 방식을 사용하며, 충돌을 해소하기 위해 세션 간의 조율이 이루어집니다.


4. LOCK 관리

4.1 잠금 상태 확인

V$LOCK 뷰를 사용하여 데이터베이스의 잠금 상태를 모니터링할 수 있습니다.

SELECT * FROM V$LOCK;

4.2 잠금 해제 방법

  1. 세션 강제 종료: 충돌을 일으키는 세션을 종료하여 잠금을 해제합니다.
    ALTER SYSTEM KILL SESSION 'sid,serial#';
    
  2. ROLLBACK: 트랜잭션을 롤백하여 LOCK을 해제합니다.
    ROLLBACK;
    

4.3 잠금 방지 전략

  • 짧은 트랜잭션 유지: 트랜잭션의 실행 시간을 최소화합니다.
  • 적절한 커밋 사용: 작업이 완료된 즉시 COMMIT을 실행하여 잠금을 해제합니다.
  • 데드락 방지: 동일한 순서로 자원을 요청하도록 코딩하여 교착 상태를 방지합니다.

5. 실무 예시

예시 1: 행 단위 잠금 관리

한 사용자가 특정 행을 업데이트하고 있는 동안 다른 사용자는 해당 행을 수정하지 못하게 하려면 오라클의 ROW LEVEL LOCK이 적용됩니다.

UPDATE employees
SET salary = salary * 1.1
WHERE employee_id = 101;
-- 이 행은 트랜잭션이 완료될 때까지 잠금 상태가 유지됩니다.

예시 2: 테이블 단위 잠금 설정

특정 작업 중 테이블 전체를 잠그고 싶을 때는 아래와 같이 명시적으로 LOCK을 설정할 수 있습니다.

LOCK TABLE employees IN EXCLUSIVE MODE;
-- 이 명령어는 다른 사용자가 테이블에 INSERT, UPDATE, DELETE를 수행하지 못하게 합니다.

예시 3: 교착 상태(Deadlock) 해결

두 트랜잭션이 서로 다른 자원에 대해 잠금을 요청하는 상황에서 교착 상태가 발생할 수 있습니다. 오라클은 이를 자동으로 감지하고 하나의 트랜잭션을 롤백합니다.

-- 트랜잭션 1
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;

-- 트랜잭션 2
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;

-- 교착 상태 발생 가능성
COMMIT;

교착 상태를 방지하려면 자원 요청 순서를 통일해야 합니다.


6. 결론

오라클 데이터베이스에서 LOCK은 데이터의 무결성과 일관성을 보장하기 위한 핵심적인 메커니즘입니다. LOCK을 제대로 이해하고 관리하면 다중 사용자 환경에서도 높은 성능과 안정성을 유지할 수 있습니다.

실무에서는 잠금 상태를 모니터링하고, 짧은 트랜잭션을 유지하며, 적절히 COMMIT을 사용하는 것이 중요합니다. 또한, 교착 상태를 예방하고 잠금을 효율적으로 해제하는 방법을 숙지하면 데이터베이스 운영의 안정성을 높일 수 있습니다.

반응형