
공통 질문
출처: https://www.youtube.com/watch?v=0PScmeO3Fig


write lock == exclusive lock
- write 불가능
- read 불가능

transation2는 기다린다

transaction1이 write lock 해제해야 접근 가능하다

transaction2는 write lock 을 획득한다

write lock 일때 read도 기다린다


read lock == shared lock
- read 가능
- write 불가능

transaction1은 read lock으로 잠근다

lock 호환성

lock 예제 1(읽기, 쓰기)
- transaction2가 먼저 시작

read lock 이 먼저 실행되서 write는 기다린다


lock 예제 2(읽기, 읽기)
- transaction2가 먼저 시작


서로가 서로에게 영향을 주지 않는다
lock 예제 3(읽기-쓰기, 읽기-쓰기)


transaction1이 먼저 수행되고, transaction2가 실행된 결과

transaction2이 먼저 수행되고, transaction1 실행된 결과

두 개가 섞이게 되면?
transaction2가 먼저 시작


y를 100+200 -> 300으로 update

x를 200 + 100 -> 300 update

결과가 이상하다.. == non serialalizable

원인이 뭘까?
read-lock
<--------------- read-lock을 풀었네?
write-lock

이 부분이 문제이다.
- transaction1에서 데이터를 읽을때 transaction2에서 update 되지 않은 data를 먼저 읽어서 사용해서 문제이다

해결방법?
순서를 바꿔라

transaction1이 읽지못하면서 아래 내용이 바뀌게 된다

변한 모습.. serialiable하게 변함

write lock을 unlock 보다 위로 옮겨라

2PL protocol
- expanding phase : lock 취득만 함
- shiriking phase: lock 반환 만 함
- serializable을 보장한다


2PL protocol 문제점
1. 데드락

2. 처리량이 낮음

해결 방법: mvcc


conservative lock
모든 lock을 취득한 뒤 transaction을 시작한다
before
x, y, z lock 걸기
- x read lock
- y,z write lock

after
- x,y,z lock을 맨 위로 올림
- 데드락 발생 X

Strict 2PL
- write lock 을 commit 이후에 unlock
before

after
- y,z write lock 을 commit 이후에 unlock 적용

String Strict 2PL
- read, write lock 을 commit 이후에 unlock
before

after
- x, y,z readm write lock 을 commit 이후에 unlock 적용

장점

단점
read lock을 너무 오래 잡고 있는다
그래서 다른 transaction이 read하는데에 기다려야한다
'학습 기록 (Learning Logs) > CS Study' 카테고리의 다른 글
noSQL (0) | 2025.02.12 |
---|---|
mvcc (0) | 2025.02.06 |
database (0) | 2025.02.06 |
transaction (0) | 2025.02.03 |
isolation level (0) | 2025.02.03 |