-
Notifications
You must be signed in to change notification settings - Fork 0
5_1. Redo Winners Protocol
김영서 edited this page Oct 7, 2021
·
1 revision
Recovery를 진행하는 시점에서 Commit을 완료한 트랜잭션은 Winner, 완료하지 못 한 트랜잭션은 Loser라고 하겠습니다.
Redo-Winners Protocol은 먼저 Winner의 모든 내용들을 REDO하고, 이후 Loser의 내용들을 UNDO 하는 프로토콜입니다.
성공한 트랜잭션의 내용을 모두 REDO하고, 실패한 트랜잭션의 내용은 UNDO하기 때문에 정상적으로 동작할 것 같지만 자발적으로 Abort를 수행한 트랜잭션은 Commit 로그가 없기 때문에 Loser로 취급되어 아래와 같은 문제가 발생합니다.
- Data - a: 0
- TRX1 - a: 0 → a: 1
- TRX1 - COMMIT
- TRX2 - a: 1 → a: 5
- TRX2 - ABORT, a: 5 → a: 1 (Undo 작업에 대한 로그를 발급하지 않는다)
- TRX3 - a: 1 → a: 8
- TRX3 - COMMIT
- SYSTEM CRASH
Winner: TRX1, TRX3
Loser: TRX2
-
REDO Phase
- Consider-Redo (TRX1 - a: 0 → a: 1)
- Consider-Redo (TRX3 - a: 1 → a: 8)
-
UNDO Phase
- Undo (TRX2 - a: 5 → a: 1)
정상적으로 동작한 경우 a: 8이 되어야 하지만 Undo 작업에 대한 로그를 발급하지 않기 때문에 a: 1이 되었습니다.
위와 같은 문제를 해결하기 위해 정상적으로 Abort를 완료한 트랜잭션에게 ROLLBACK Log를 발급하고, Rollback에서 수행한 Undo 작업에 대해 CLR을 발급합니다.
CLR에 대한 CLR은 발급하지 않습니다. 즉, Rollback의 Undo 작업에 대한 CLR은 하나의 Log에 대해 하나만 발행합니다.
- Data - a: 0
- TRX1 - a: 0 → a: 1
- TRX1 - COMMIT
- TRX2 - a: 1 → a: 5
- TRX2 - ABORT
- TRX2 - a: 5 → a: 1 (COMPENSATE)
- TRX2 - ROLLBACK
- TRX3 - a: 1 → a: 8
- TRX3 - COMMIT
- SYSTEM CRASH
Winner: TRX1, TRX2, TRX3
Loser: None
-
REDO Phase
- Consider-Redo (TRX1 - a: 0 → a: 1)
- Consider-Redo (TRX2 - a: 1 → a: 5)
- Consider-Redo (TRX2 - a: 5 → a: 1) →
CLR - Consider-Redo (TRX3 - a: 1 → a: 8)
-
UNDO Phase
- No Losers - Do Nothing
정상적으로 a: 8이 되었습니다.