DB Lock

지식저장공간·2023년 6월 1일
0

DB

목록 보기
11/19

Lock

하나의 트랜잭션에 데이터를 write 할때 단순한 값변경 과정이 아니고 같은 데이터에 또다른 read/write가 있다면 예상치 못한 값이 read/write 될 수 있기 때문에 Lock을 통해 동시성을 관리한다.

예제

예제1

데이터를 read 하거나 write하려는 경우 lock을 획득해야한다. 다른 트랜잭션이 lock을 획득 했을 경우 lock이 반환될때 까지 대기한다.

예제2

예제3

트랜잭션2가 read lock을 획득하고, 트랜잭션1은 write하려고 하기 때문에 작업을 진행할 수가 없고, 트랜잭션2가 read lock을 반환할 때 까지 대기한다.

예제 4

트랜잭션2가 read lock을 얻은 상태에서 트랜잭션1이 read하려고 할때 트랜잭션1은 read가 가능하다. read lock은 다른 read lock을 허용한다.

Write Lock

write lock(exclusive lock) : read / write 할 때 사용한다.
*다른 트랜잭션이 같은 데이터를 read / write 하는것을 허용하지 않는다.
write lock이라고 해서, write할때만 획득하는게 아닌, write lock을 획득하고 read, write 둘다 가능하다.

Read Lock

read lock(shared lock) : read 할 때 사용한다.
다른 트랜잭션이 같은 데이터를 read 하는 것은 허용한다.
read lock은 write lock과는 다르게 read할 때에만 획득한다.

2PL protocol

2PL(two-phase locking)

read lock을 획득하고 read 후 read lock을 반납한 후에 다른 lock 획득

read lock을 획득하고 read 후 write lock을 획득한 후 read lock을 반납한다. 락을 지니고 있는 상태에서 다른락이 필요할 경우 다른락을 획득 한 후에 기존 락이 반납가능하게 한다.

트랜잭션의 순서에 따라 결과값이 달라진다.

락을 사용하여 두개의 트랜잭션을 수행하면 값이 달라진다. 즉 nonserializable 하다. -> 락만으로는 이상 현상을 모두 방지할 수 없다. 커밋되지 않은 데이터를 읽고 쓰기 때문

트랜잭션에서 락을 획득하는 모든 과정이 언락 과정보다 먼저 수행되도록한다.

락을 획득만 하는 expanding phase, 락을 반환만 하는 shrinking phase가 존재하기 때문에 two phase locking이라 한다.

Expanding phase

lock을 취득하기만 하고 반환하지는 않는 phase

Shrinking phase

예제

락을 획득하고 데이터를 처리하면서 락을 반납한다. 락을 반환한 후로는 절대 락을 획득하지 않는다. 모든 락 획득 과정은 락 반납 과정보다 먼저 수행해야한다.

conservative 2PL : 모든 락을 획득한 후 transaction을 시작한다.
데드락이 발생하지 않지만, 성능이 낮다.

strict 2PL : recoverability를 보장하기 때문에, 롤백이 일어나도 데이터 정합성을 충족시킨다. write lock을 지닌 트랜잭션은 write한 데이터에 대해 commit 또는 rollback 한 후 write lock을 반환한다.

strong strict 2PL : recoverability를 보장하기 때문에, 롤백이 일어나도 데이터 정합성을 충족시킨다. write lock 뿐만 아니라, read lock도 write 한 데이터가 commit 또는 rollback된 후 부터 lock을 반환한다. S2PL 보다 구현이 쉽다.
하지만, x에 대한 lock을 오래 가지고 있다.

문제점

성능

write - write를 제외하고는 서로를 block되는 현상을 해결해보자 -> MVCC

데드락

한 트랜잭션이 read lock을 획득하고 다른 트랜잭션이 write를 해야할 때 해당 트랜잭션은 write lock을 획득할때 까지 block 상태이다.

그리고 트랜잭션2가 read 후 write lock을 획득해야 하지만 트랜잭션 1이 read lock을 갖고 있기 때문에 트랜잭션2는 write lock을 획득할 수 없다.

즉, Deadlock. 트랜잭션 1은 x에 대해 lock을 얻지 못하고, 트랜잭션2는 y에 대해 lock을 얻지 못한다.

출처 : 쉬운코드 유튜브

profile
발전하는 개발자가 꿈입니다. 지식을 쌓고 지식을 활용해 목표 달성을 추구합니다.

0개의 댓글