2025년 4월 10일 작성

Database Lock - Data 잠그기

Database Lock : Transaction 처리의 순차성을 보장하기 위한 방법

  • DB lock은 user 다수의 동시 접근 상황에서 data 일관성과 무결성을 보장하기 위한 핵심 mechanism입니다.
  • transaction 간 간섭을 제어하여 ACID 특성 중 isolation을 구현합니다.
  • 적절한 lock 전략 선택은 성능과 data 무결성 사이의 균형을 유지하는 데 중요합니다.

Lock의 필요성

  • DBMS는 다수의 transaction이 동시에 data에 접근할 수 있도록 설계되었습니다.
  • 그러나 동시에 여러 transaction이 data를 수정하면 data 일관성이 깨질 수 있습니다.
  • 이를 방지하기 위해 DBMS는 lock을 사용하여 transaction 간의 data 접근을 제어합니다.

  • lock은 특정 data에 대한 접근을 제한하여 transaction 간의 간섭을 방지합니다.
    • transaction은 lock을 통해 data를 안전하게 읽고 쓸 수 있습니다.
    • lock은 transaction이 완료될 때까지 유지되며, transaction이 commit되면 lock이 해제됩니다.

잠금 수준에 따른 분류

  • database lock은 잠금 수준에 따라 공유 잠금(shared lock)과 배타 잠금(exclusive lock)으로 나뉩니다.

Shared Lock(S-Lock)

  • 읽기 잠금(read lock)이라고도 불리며, 동시에 여러 transaction이 획득할 수 있습니다.
  • data를 읽을 때 사용하는 lock으로 다른 transaction의 읽기는 허용합니다.
  • 다른 transaction의 쓰기 작업은 차단하여 읽는 동안 data 변경을 방지합니다.
  • SELECT 문 실행 시 기본적으로 적용됩니다.

Exclusive Lock(X-Lock)

  • 쓰기 잠금(write lock)이라고도 하며, 한 번에 하나의 transaction만 획득할 수 있습니다.
  • data 변경(INSERT, UPDATE, DELETE) 작업 시 사용합니다.
  • 다른 transaction의 read와 write 모두를 차단합니다.
  • data 일관성과 무결성을 보장하는 가장 강력한 lock 형태입니다.

Lock 범위에 따른 분류

  • database lock은 범위에 따라 row-level lock, page-level lock, table-level lock 등으로 나눌 수 있습니다.

Row-level Lock

  • 개별 data row에 lock을 적용합니다.
  • 다른 row에 대한 접근은 제한하지 않아 동시성이 높습니다.
  • 세밀한 lock 관리로 data 접근 경합을 최소화합니다.
  • Oracle, PostgreSQL, MySQL(InnoDB) 등에서 지원합니다.

Page-level Lock

  • database page 단위로 lock을 적용합니다.
    • page는 일반적으로 여러 row를 포함하는 물리적 storage 단위입니다.
  • row-level lock보다 관리 overhead가 적지만, 불필요한 경합이 발생할 수 있습니다.
  • Microsoft SQL Server에서 사용했던 방식입니다.
    • 현재는 row-level lock 지원.

Table-level Lock

  • table 전체에 lock을 적용합니다.
  • 구현이 단순하지만 동시성이 크게 저하됩니다.
  • 전체 table scan이나 대규모 data 변경 작업에 유용합니다.
  • 모든 DBMS에서 지원하며, MySQL의 MyISAM과 같은 engine에서 주로 사용합니다.

Database-level Lock

  • database 전체에 대한 lock을 설정합니다.
  • 주로 schema 변경이나 database backup 작업에 사용됩니다.
  • 모든 data 접근을 차단하므로 매우 제한적인 상황에서만 사용합니다.

특수 목적 Lock

  • 특수 목적 잠금은 특정 상황이나 목적에 맞춰 설계된 lock입니다.

Intent Lock

  • 상위 level에 하위 level의 lock 의도를 표시하는 lock입니다.
    • 예를 들어, 상위 level이 table lock, 하위 level이 row lock이라면, intent lock은 table lock을 획득하기 전에 row lock을 획득하겠다는 의도를 나타냅니다.
  • 계층적 lock 구조에서 lock 호환성 검사를 효율화합니다.
  • Intent Shared(IS), Intent Exclusive(IX), Shared Intent Exclusive(SIX) 등 여러 유형이 있습니다.

Update Lock

  • read 후 write가 예상되는 상황에서 사용합니다.
  • 초기에는 shared lock처럼 동작하지만, 필요시 exclusive lock으로 쉽게 upgrade됩니다.
  • deadlock 가능성을 줄이는 데 도움이 됩니다.

Schema Lock

  • table schema 변경 시 사용됩니다.
  • DDL(Data Definition Language) 명령어 실행 시 적용됩니다.
  • 일반적으로 높은 수준의 제한을 가지며 다른 접근을 차단합니다.

Predicate Lock

  • 특정 조건(predicate)에 부합하는 data에 대한 lock입니다.
  • phantom read 문제를 해결하기 위해 도입되었습니다.
  • 실제 구현은 복잡하여 많은 DBMS에서는 index lock이나 range lock으로 대체합니다.

Lock 기법

  • lock 기법은 DBMS에서 transaction 간 data 접근을 제어하는 구체적인 방법입니다.

Optimistic Lock

  • 충돌이 드물다고 가정하고, 실제 update 시점에만 충돌을 감지합니다.
  • 일반적으로 version 번호나 timestamp를 사용하여 구현합니다.
  • 높은 동시성을 제공하지만, 충돌 시 transaction을 재시도해야 합니다.
  • 읽기 작업이 많고 쓰기 충돌이 적은 환경에 적합합니다.

Pessimistic Lock

  • 항상 충돌이 발생할 것으로 가정하고 사전에 lock을 획득합니다.
  • 전통적인 DBMS에서 사용하는 기본적인 lock 방식입니다.
  • 충돌 가능성이 높은 환경에서 data 일관성을 보장합니다.
  • 동시성이 저하될 수 있지만 transaction 충돌로 인한 재시도가 없습니다.

Lock 관련 문제

  • lock 관련 문제는 DBMS의 성능과 안정성에 큰 영향을 미칩니다.

Deadlock

  • 두 개 이상의 transaction이 서로가 보유한 lock을 기다리는 상황입니다.
  • DBMS는 deadlock detection, prevention, timeout 등의 방법으로 해결합니다.
  • 발생 시 일부 transaction을 강제 종료(rollback)하는 방식으로 해소합니다.

Lock Escalation

  • 다수의 작은 lock이 더 큰 단위의 lock으로 확장되는 현상입니다.
    • 예를 들어, row-level lock(작은 lock)이 너무 많아지면 DBMS가 이를 table-level lock(더 큰 단위의 lock)으로 변경합니다.
  • system 내 lock 관리 overhead를 줄이기 위해 DBMS가 자동으로 수행합니다.
  • 동시성이 저하될 수 있으나 resource 사용 효율성은 높아집니다.

Blocking

  • 한 transaction이 보유한 lock으로 인해 다른 transaction이 대기하는 상황입니다.
  • 장시간 blocking은 system 성능을 심각하게 저하시킬 수 있습니다.
  • 적절한 transaction 설계와 lock timeout 설정으로 관리합니다.

DBMS별 Lock 특성

  • DBMS에 따라 lock 처리 방식과 전략이 다릅니다.

Oracle

  • row-level lock을 기본으로 사용합니다.
  • MVCC(Multi-Version Concurrency Control)를 통해 읽기 작업에 lock이 불필요합니다.
  • SELECT FOR UPDATE 구문으로 명시적 row lock을 지원합니다.

MySQL

  • storage engine에 따라 lock 방식이 다릅니다.
    • InnoDB : row-level lock과 MVCC 지원.
    • MyISAM : table-level lock만 지원.
  • transaction 격리 수준에 따라 lock 전략이 달라집니다.

PostgreSQL

  • row-level lock과 MVCC를 지원합니다.
  • 명시적 lock 명령어(LOCK TABLE)와 FOR UPDATE 등 다양한 lock option을 제공합니다.
  • 자동 deadlock 감지 기능을 갖추고 있습니다.

SQL Server

  • row-level, page-level, table-level lock을 상황에 따라 사용합니다.
  • lock hint를 통해 lock 동작을 세밀하게 제어할 수 있습니다.
  • lock escalation 임계값 조정이 가능합니다.

Reference


목차