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이다.