Concurrency Control 기초 2 - Recoverability
여기 100만원을 가진
조이
와 200만원을 가진리버
라는 사람이 있다.
조이
가리버
에게 20만원을 이체할 때,리버
도 자신의 계좌에 30만원을 입금하는 상황을 생각해보자.
위 상황은 어떤 문제가 발생한 것일까?
좀 더 자세하게 살펴보자.
위와 같은 현상이 발생하는 스케줄을 Unrecoverable Schedule
이라고 한다.
write
했었던 데이터를 읽은 경우에 해당한다. 즉, 유효하지 않은 데이터를 읽는 경우를 말한다. 이러한 이유로 Unrecoverable Schedule
이 아닌 Recoverable Schedule
을 허용해야 한다.
write
한 트랜잭션이 먼저 commit
/rollback
전까지 커밋 하지 않은 경우에 해당한다. 트랜잭션1
)이 종료될 때까지 의존하는 트랜잭션(예시 트랜잭션2
)은 커밋하면 안 된다.write(리버_balance = 230)
경우를 생각해볼 수 있음 그럼 데이터를 write
한 트랜잭션이 commit
/rollback
한 뒤에 데이터를 읽는 스케줄(Cascadeless Schedule
)만 허용하면 어떨까?
그럼 의존하는 트랜잭션이 없기 때문에 그냥 롤백 하면 된다!
avoid cascading rollback
이라고도 한다. write
한 데이터는 읽지 않는 경우를 말한다. Cascadeless Schedule
은 약간의 문제가 발생할 수 있다.
아래와 같은 문제를 생각해 볼 수 있다.
어느 피자집의 피자 가격이 3만원이다.
이 피자 가격을 2만원으로 낮추려는데, 직원은 실수로 1만원으로 낮추고 사장님은 2만원으로 낮추는 상황을 생각해보자.
피자 가격: 3만원
----------------------- transaction 1 (직원)
t1_write(pizza = 1만원)
........................ transaction 2 (사장)
t2_write(pizza = 2만원)
t2_commit
........................
t1_abort
------------------------
피자 가격: 3만원
Casecadeless Schedule
을 사용했지만 사장님 작업(트랜잭션2)의 결과 사라지는 문제가 발생한다.
이 문제를 해결하기 위해 Stric Schedule
을 사용할 수 있다.
write
한 데이터는 쓰지도 읽지도 않는 경우피자 가격: 3만원
----------------------- transaction 1 (직원)
t1_write(pizza = 1만원)
t1_abort
------------------------
........................ transaction 2 (사장)
t2_write(pizza = 2만원)
t2_commit
........................
피자 가격: 2만원
Unrecoverable Schedule
은 롤백이 발생했을 때 회복 불가능할 수 있기 때문에, DBMS에서 허용하면 안된다.Recoverable Schedule
은 롤백이 발생했을 때 회복 가능하기 때문에 이런 스케줄은 DBMS에서 허용해줘도 된다. Recoverable schedule
중 cascade rollback
이 발생하지 않도록 하는 스케줄이 Cascadeless Schedule
이다.Cascadeless Schedule
중에서도 더 엄격한 스케줄을 Strict Schedule
이라고 한다 (read
X /write
X).Recoverable Schedule
은 Recoverability
속성을 가진다.Serializability
와 Recoverability
를 제공한다.isolation
이다.