[DB] LOCK을 활용한 Concurrency Control 기법
## 유튜버 '쉬운코드' 님의 강의 영상을 개인공부를 위해 정리한 내용이여서 매우 함축적이며 요약된 것입니다.
락(lock)
데이터의 동시 접근 충돌을 막기 위해 잠그는 장치
* 락이 필요한 이유
- 여러 사용자가 동시에 같은 데이터를 읽거나 수정하려고 할때 이상현상이 발생할 수 있음.
- 락을 걸어서 데이터의 일관성을 유지해주기 위해서 ( A가 계좌 잔액을 읽는 동안, B가 동시에 잔액을 바꿔버리면 A의 결과는 신뢰할 수 없음 )
락의 종류
- Write Lock (Exclusive Lock)
다른 트랜잭션이 같은 데이터를 read/write 하는 것을 허용하지 않음.
- Read Lock (Shared Lock)
read할때 사용하며, 다른 트랜잭션이 같은 데이터를 read하는 것은 허용하지만 쓰기작업은 허용하지 않는다.
예시:
1. T2(Transaction2)가 read_lock를 획득
2. T1이 write_lock 획득을 시도하지만 T2가 read_lock을 가지고 있기에 실패 (블로킹)
3. T2가 x 값을 읽으며 락을 반환
4. T1은 블로킹이 해제되며 쓰기작업을 하고 write_lock을 반환
* 락을 사용하여도 이상현상이 발생하는 경우

T1이 먼저 실행되고 T2가 실행되는 경우 최종결과값 : x -> 300 , y -> 500
T2가 먼저 실행되고 T1이 실행되는 경우 최종결과값: x-> 400 , y -> 300

위와 같이 락을 사용하여도 두 트랜잭션의 순서가 섞이면 x = 300, y = 300 와 같은 이상현상이 발생할 수 있다.
--> 업데이트 되지 않은 값들을 읽거나 쓰기 작업을 하기 때문에 발생한다.
이러한 문제는 2PL Protocol 을 통해 해결할 수 있다.
2PL Protocol (two-phase locking)
트랜잭션에 모든 lock 작업이 최초 unlock 작업보다 먼저 수행되도록 하는 기법
- Expanding phase
Lock을 취득하고 반환하지 않는 페이지
ex : read_only (y) , write_lock (y) 등
- Shrinking phase
lock을 반환만 하고 취득하지 않는 페이지
ex : unlock (y) 등
하지만 2pl 프로토콜을 사용하면 어쩌다가 데드락이 발생할 수도 있다.

서로가 서로의 자원을 기다리는 데드락 상황이 발생한다.
데드락이 발생하지 않는 conservative 2PL 방식도 존재한다.
이 방식은 일단 모든 lock (read_lock, write_lock)을 취득한뒤에 트랜잭션을 시작하는 기법이나
실용적이지 않다고 한다.
그 밖에도
write_lock을 커밋 or 롤백 될때 반환하는 strict 2PL 프로토콜이 존재한다.
* 자세한 내용은 아래 링크를 통해 영상 시청하는 것을 권합니다. (좋은 내용이 많이있음.)
https://www.youtube.com/watch?v=0PScmeO3Fig&t=187s