공유 락(Shared Lock)과 배타 락(Exclusive Lock)

Kkd·2024년 12월 11일
0

매일메일 개념정리

목록 보기
23/93

공유 락과 배타 락

1. 공유 락 (Shared Lock, S-Lock)

  • 다수의 읽기 작업이 동시에 수행될 수 있도록 허용하는 락입니다.
  • 데이터의 읽기(Read) 작업만 허용하며, 다른 트랜잭션이 데이터에 대해 쓰기 작업을 수행할 수 없습니다.
  • 여러 트랜잭션이 동시에 같은 자원에 공유 락을 걸 수 있습니다.

예시:
트랜잭션 A와 B가 동시에 특정 데이터를 읽는 작업을 수행할 때, 공유 락을 사용하여 데이터의 일관성을 유지합니다.

SELECT * FROM table_name WHERE id = 1 FOR SHARE;

2. 배타 락 (Exclusive Lock, X-Lock)

  • 읽기와 쓰기 작업 모두를 수행할 수 있는 락입니다.
  • 특정 데이터에 배타 락이 걸려 있으면, 다른 트랜잭션은 읽기와 쓰기 작업 모두를 수행할 수 없습니다.
  • 데이터의 수정 작업이 필요할 때 사용됩니다.
  • 자원에 대해 독점적인 권한을 갖습니다.

예시:
트랜잭션 A가 특정 데이터를 수정할 때 배타 락을 걸면, 트랜잭션 B는 해당 데이터에 접근할 수 없습니다.

SELECT * FROM table_name WHERE id = 1 FOR UPDATE;

배타 락 사용 시 데드락이 발생하는 상황

데드락(Deadlock):
두 개 이상의 트랜잭션이 서로가 점유한 자원의 락 해제를 기다리며 무한 대기 상태에 빠지는 현상.

발생 상황 예시:
1. 트랜잭션 A가 자원 X에 배타 락을 걸고, 자원 Y에 락을 요청.
2. 동시에 트랜잭션 B가 자원 Y에 배타 락을 걸고, 자원 X에 락을 요청.
3. A는 B가 점유한 자원 Y를 기다리고, B는 A가 점유한 자원 X를 기다리면서 데드락 발생.


데드락 해결 방법

  1. 예방(Prevention)
    데드락이 발생하지 않도록 사전에 차단하는 방법.

    • 자원 요청 순서 지정:
      트랜잭션이 자원을 요청하는 순서를 고정시켜 순환 대기를 방지.
    • 한 번에 락 요청:
      필요한 모든 자원을 한 번에 요청. 자원을 얻을 수 없으면 대기하지 않고 즉시 중단.
    • 타임아웃 설정:
      특정 시간 동안 락이 해제되지 않으면 트랜잭션을 강제로 중단.
  2. 회피(Avoidance)
    시스템이 실시간으로 자원 상태를 분석하고, 데드락이 발생할 가능성이 있는 경우 자원 할당을 피하는 방법.

    • 은행가 알고리즘(Banker's Algorithm):
      현재 자원 상태와 요청을 분석하여 데드락 가능성을 평가하고, 위험하면 요청 거부.
  3. 검출(Detection) 및 복구(Recovery)
    데드락이 발생했는지 주기적으로 검사하고, 발생 시 복구하는 방법.

    • 검출:
      • 주기적으로 자원 상태를 검사해 데드락 여부 확인.
      • 순환 대기 그래프를 생성하여 확인.
    • 복구:
      • 특정 트랜잭션 강제 종료.
      • 트랜잭션 롤백 및 재시작.
  4. 낙관적 동시성 제어(Optimistic Concurrency Control)
    트랜잭션 간 충돌 가능성이 낮은 경우, 락을 사용하지 않고 작업을 진행하며 충돌 발생 시 롤백.


읽기와 쓰기 허용 여부의 실제 동작 방식

1. 읽기 작업

  • 공유 락(S-Lock): 공유 락이 허용된 상태에서는 읽기 작업이 가능하며, 여러 트랜잭션이 동시에 데이터를 읽을 수 있습니다.
  • 배타 락(X-Lock): 락을 사용하지 않는 읽기(Consistent Nonlocking Reads)의 경우 읽기가 가능하지만, 락을 사용하는 읽기(Locking Reads)에서는 불가능합니다.

2. 쓰기 작업

  • 공유 락(S-Lock): 공유 락이 설정된 데이터는 쓰기 작업을 수행할 수 없습니다.
  • 배타 락(X-Lock): 배타 락이 설정된 경우에만 쓰기 작업이 가능합니다.

트랜잭션 격리 수준과의 관계

공유 락과 배타 락의 동작 방식은 트랜잭션의 격리 수준에 따라 달라집니다.
트랜잭션 격리 수준은 트랜잭션 간 데이터 충돌을 방지하는 정도를 정의하며,
공유 락과 배타 락의 동작 방식을 결정짓는 중요한 요소입니다.

  • Read Uncommitted:
    배타 락 없이 데이터를 읽습니다.
    읽기 락 없이 쓰기가 진행될 수 있어 Dirty Read가 발생할 수 있습니다.

  • Read Committed:
    데이터를 읽을 때 공유 락이 설정됩니다.
    쓰기 중인 데이터를 읽지 않도록 보호합니다.

  • Repeatable Read:
    데이터를 읽을 때 공유 락을 설정하여 읽기 일관성을 보장합니다.
    동시에 배타 락을 설정하여 쓰기를 방지합니다.

  • Serializable:
    가장 높은 격리 수준으로, 공유 락과 배타 락을 모두 엄격히 사용하여 완벽한 트랜잭션 고립을 보장합니다.


요약

  • 공유 락(S-Lock): 여러 트랜잭션이 동시에 데이터를 읽을 수 있게 허용.
  • 배타 락(X-Lock): 특정 트랜잭션만 데이터의 읽기와 쓰기를 독점.
  • 데드락 발생: 서로 점유한 자원의 락 해제를 기다릴 때 발생.
  • 해결 방법: 예방(순서 지정, 타임아웃), 회피(은행가 알고리즘), 검출 및 복구, 낙관적 제어.
  • 공유 락과 배타 락의 핵심은 "락 간 호환 여부"입니다.
  • 공유 락은 동일한 자원에 공유 락을 허용하여 읽기가 가능하고, 쓰기를 불허합니다.
  • 배타 락은 자원을 독점적으로 사용하며, 락을 사용하지 않는 읽기(Consistent Nonlocking Reads)는 허용될 수 있습니다.
  • 락의 동작은 트랜잭션의 격리 수준과 읽기/쓰기 방식에 따라 다르게 작동합니다.

추가 학습 자료

profile
🌱

0개의 댓글