데이터베이스 Lock

YeJi Kim·2023년 5월 4일
0

📍 10분 테코톡 - 마루의 데이터베이스 Lock를 보고 정리한 내용이다.


해당 영상에서는 데이터를 '왜?' 잠그고 '어떻게' 잠그는지에 대해 설명하고 있다.

1. 데이터베이스에 잠금이 왜 필요할까? - 동시성 제어

  • 동시성 제어
    • 트랜젝션들이 동시에 수행될 때, 일관성을 해치지 않도록 데이터 접근을 제어하는 DBMS의 기능



2. Lock의 종류 - 낙관적, 비관적

  • 낙관적 잠금(Optimisstic Lock)

    • 데이터 갱신 시 경합이 발생하지 않을 것이라고 봄
    • 한 사용자가 업데이트를 완료하면, 동시 업데이트 확약을 시도하는 다른 사용자들에게 충돌이 있음을 알림
    • 데이터를 업데이트 시켜주기 전 버전을 다시 읽어 온다. 처음 읽어 온 버전과 다음에 읽어온 버전이 똑같다면 버전을 다시 업데이트시켜줄 수 있다.
    • 반면에, 처음 읽어 온 버전과 다음에 읽어온 버전이 달라서 충돌이 발생한다면 rollback 시킨다.
  • 비관적 잠금(Pessimistic Lock)

    • 동일한 데이터를 동시에 수정할 가능성이 높다라고 봄
    • 다른 사용자는 먼저 시도한 사용자가 변경을 확약해서 레코드 잠금을 릴리스할 때까지 대기해야 함

Q. 각각 어떨 때 쓰면 좋을까?

  • 낙관적 잠금(Optimisstic Lock)
    • 롤백을 줄이기 위해서 동시 업데이터가 거의 없는 경우에 사용하는 것이 좋다.
  • 비관적 잠금(Pessimistic Lock)
    • 동시 업데이트가 빈번한 경우
    • 롤백을 하기 힘든 외부 시스템과 연동한 경우



3. Pessimistic Lock 연산의 종류 - 공유, 베타

  • 공용(shared) lock

    • read 연산 실행 가능, write 연산 실행 불가능
    • 데이터에 대한 사용권을 여러 트랜잭션이 함께 가질 수 있음
  • 베타(exclusive) lock

    • read 연산과 write 연산을 모두 실행 가능
    • 베타 lock 연산을 실행한 트랜잭션만 해당 데이터에 대한 독점권을 가짐

Lock 연산의 양립성

  • 베타 lock이 들어가는 순간, 양립할 수 없다.



4. Lock의 단위

lock의 범위를 크게 정한다면 구현이 간순하지만 병행성이 떨어진다.
lock의 범위를 작게 정한다면 구현이 복잡하지만 병행성이 높아진다.
lock의 범위는 데이터베이스의 종류마다 다르다.



5. Lock으로 발생할 수 있는 문제점 - 블로킹, 데드락

  • Blocking

    • lock들의 경합이 발생하여 특정 세션이 작업을 진행하지 못하고 멈춰 선 상태
    • 데이터에 대해서 하나의 트랜잭션이 베타 lock을 걸면 다른 트랜잭션들은 어떠한 lock도 걸지 못하고 대기해야하기 때문이다.
    • 블로킹이 풀리는 시점은 트랜잭션이 commit 혹은 rollback을 할 때이다.
    • 해결 방안!
      • 트랜잭션을 짧게 정의
      • 같은 데이터를 갱신하는 트랜잭션이 동시에 수행되지 않도록 설계
      • Lock Timeout을 이용하여 잠금해제 시간을 조절
  • DeadLock 교착상태

    • 서로의 Lock이 해제되기를 무한정 기다리는 상황
    • 해결 방안?
      • 트랜잭션 진행방향을 같은 방향으로 처리
      • 트랜잭션 처리속도를 최소화
      • Lock Timeout을 이용하여 잠금해제 시간을 조절



더 알아보기

  • 동시성 제어 기법들
  • 트랜잭션 격리 수준
  • 데이터베이스 종류별 lock
  • JPA의 lock
profile
이전의 기록들 👉 https://blog.naver.com/reviewerkyj

0개의 댓글