리커버러블 스케줄은 한 트랜잭션이 커밋되기 전에 그 트랜잭션이 읽은 데이터를 작성한 트랜잭션이 먼저 커밋되는 스케줄입니다. 이는 트랜잭션이 커밋되지 않은 상태에서 데이터를 읽고 실패해 롤백될 때, 그 데이터를 읽은 다른 트랜잭션도 함께 롤백되어야 하는 상황을 방지합니다.
예를 들어, 트랜잭션 T1이 T2가 작성한 데이터를 읽고, T2가 먼저 커밋된 후 T1이 커밋된다면 이는 리커버러블 스케줄입니다. 반면, T2가 커밋되지 않은 상태에서 T1이 커밋된다면, T2가 나중에 롤백될 경우 이미 커밋된 T1도 롤백해야 하는 문제가 발생합니다. 이런 경우를 "언리커버러블 스케줄(Unrecoverable Schedule)"이라 하며, 데이터베이스 시스템에서 허용해서는 안 됩니다.
캐스케이드리스 스케줄은 리커버러블 스케줄보다 더 엄격한 형태로, 커밋되지 않은 트랜잭션이 작성한 데이터를 다른 트랜잭션이 읽지 못하게 합니다. 이를 통해 트랜잭션 실패 시 다른 트랜잭션들이 연쇄적으로 롤백되는 "캐스케이드 롤백(Cascading Rollback)"을 방지할 수 있습니다.
이 스케줄에서는 트랜잭션이 커밋되기 전까지 그 트랜잭션이 작성한 데이터를 다른 트랜잭션이 읽을 수 없어, 롤백 발생 시 문제를 최소화합니다.
스트릭트 스케줄은 트랜잭션 스케줄링에서 가장 엄격한 형태로, 아직 커밋되지 않은 트랜잭션이 생성한 데이터를 다른 트랜잭션이 읽거나 쓸 수 없도록 하는 제한을 두고 있습니다. 이로 인해 캐스케이드리스 스케줄보다 훨씬 더 강력한 보호 메커니즘을 제공하게 됩니다.
이 스케줄링 방식에서는 특정 트랜잭션이 커밋되기 전까지 그 트랜잭션이 생성한 데이터에 대해 다른 트랜잭션이 접근할 수 없으므로, 롤백 시 데이터의 일관성을 완벽하게 유지할 수 있게 됩니다.
한 피자 가게에서 피자 가격을 낮추려는 두 개의 트랜잭션을 예로 들어봅시다. 트랜잭션 T1은 가격을 1만 원으로, T2는 2만 원으로 설정하려 합니다. T1이 먼저 가격을 1만 원으로 설정하고 T2가 2만 원으로 설정한 후, T1이 실패하여 롤백된다면 최종 가격은 3만 원(롤백 전 가격)이 됩니다. 이는 T2의 결과가 사라진 것으로, 캐스케이드리스 스케줄의 예시가 될 수 있습니다.
반면, 스트릭트 스케줄에서는 T1이 커밋되기 전까지 T2가 데이터에 접근할 수 없으므로, T1이 롤백되어도 T2의 결과가 보존됩니다.
이 세 가지 스케줄링 개념을 이해하면, 트랜잭션 실패 시 데이터베이스의 대응 방식을 더 잘 파악할 수 있습니다.
https://www.youtube.com/watch?v=aL0XXc1yGPs&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe