본문 바로가기
데이터베이스

Shared Lock 과 Exclusive Lock

by N.Damgom 2021. 12. 5.

여러 트랜잭션을 동시에 실행하면 생기는 문제

  • 트랜잭션이 동시에 여러개 실행된다면 여러 트랜잭션이 동시에 같은 데이터를 참조해 데이터의 일관성이 깨질 수 있다.
  • 그러므로 트랜잭션이 하나씩 실행되는 것처럼 스케줄링할 필요가 있다.
  • 여러 트랜잭션 스케줄링 방법이 있지만 보통 잠금을 사용한다.
  • 잠금이란 자신이 데이터를 수정 중이라는 것을 알리는 방법이다.

Shared Lock, 줄여서 LS

  • Shared Lock, 공유할 수 있는 락이다.
  • 즉 LS가 걸려있을 때 다른 LS를 걸 수 있다.
  • 바꿔말하면 LS끼리는 Block 되지 않는다.
  • 읽기에 사용된다.

Exclusive Lock, 줄여서 LX

  • Exclusive Lock, 공유할 수 없는 락이다.
  • 무조건 하나만 걸 수 있다.
  • LX는 LS, LX 어떠한 락이라도 허용하지 않는다.
  • 쓰기에 사용된다.

2 Phase Locking, 줄여서 2PL

  • 락이 있더라도 아무때나 걸고 해제하면 문제가 생긴다.
  • 한번 건 락은 트랜잭션 끝까지 유지하고
  • 트랜잭션 끝에서 한번에 풀어줘야한다.
  • 이를 확장단계, 수축단계라고 한다.

트랜잭션 고립 수준

  • READ UNCOMMITTED
    • 가장 하위의 고립수준이다.
    • 읽기 시 LS 걸지 않는다.
    • 쓰기 시 LX를 건다.
    • 읽기시 LS를 걸지 않으므로 쓰고 있는 중인 데이터를 읽을 수 있다.
      • 다른 트랜잭션이 쓰는 중인 데이터를 읽을 수 있다.
      • 그러므로 커밋되지 않은 데이터를 읽었다가 롤백되면 생기는 DIRTY READ,
      • 트랜잭션 내에서 데이터 읽을 때마다 달라지는 UNREPEATABLE READ ( 직렬로 실행하면 이럴 일이 없다.)
      • PHANTOM READ 문제 발생가 발생 가능하다
  • READ COMMITTED
    • 데이터를 읽는 동안 LS를 걸지만 바로 해제한다.
    • 마찬가지로 쓰기 시에는 LX를 건다
    • 수정중인 데이터를 읽는 DIRTY READ는 생기지 않는다.
    • 데이터A 읽고(LS바로해제) - 타 트랜잭션 데이터A수정 - 데이터 A 다시 읽기 : UNREATABLE READ 발생
    • 마찬가지로 집합적 락을 걸지 않으므로 PHANTOM READ 발생 가능하다.
  • REPEATABLE READ
    • 읽기 시 LS 걸고 트랜잭션 끝까지 유지한다.
    • innodb의 기본 설정이다.
    • 데이터A 읽고(LS바로해제) - 타 트랜잭션 데이터A수정(차단) - 데이터 A 다시 읽기 : UNREATABLE READ 발생하지 않는다.
    • 마찬가지로 집합적 락을 걸지 않으므로 PHANTOM READ 발생 가능하다.
  • SERIALIZABLE
    • 인덱스에 공유락을 걸어 다른 트랜잭션아 INSERT를 할 수 없다.
    • PHANTOM 문제가 사라지나, 성능상 이유로 잘 사용하지 않는다.

선점 잠금과 비선점 잠금 ( Pessimistic and Optimistic Lock )

  • 선점 잠금이란 앞서 보았듯이 2PL을 이용하는 방법
  • Locking이 확장하므로 원형으로 자신의 데이터를 Holding하고 타 트랜잭션에 요청하는 교착상태가 발생할 수 있다.
  • 교착상태에서 벗어나기 위해 쿼리 Timeout이 필요하다.
  • 비선점 잠금 혹은 낙관적 락은 데이터가 동시에 변경되지 않는다고 가정한다.
  • 대신 버전을 기록해서 내가 읽었던 버전이랑 다르면 트랜잭션을 취소한다.

MVCC ( Multi Version Concurrency Control )

  • 데이터를 버저닝하는 방법으로 동시성을 처리한다.
  • 트랜잭션1이 A 를 A`으로 수정하면 A에 대해 새로운 버전이 생긴다.
  • 트랜잭션2가 A 를 트랜잭션1의 수정 전에 읽고 수정 후에 다시 읽을려고 시도하면 DBMS가 이전 버전의 데이터를 보여준다.
  • 추가적인 작업이 필요하다.