Two-phase Commit
Presumed Nothing
Protocol #
- coordinator sends
PREPARE to notify transaction is terminated - Each cohort send
COMMIT-VOTE or ABORT-VOTE - Coordinator collect response
- Coordinator send result
ABORT or COMMIT
Cohort Activity
Abort? #
- Client mark first action of a transaction, cohort mark the transaction active when see first.
- If terminate and not active ->
ABORT
- Client and cohort record number of actions
- Client send count to coordinator
- If not match ->
ABORT
Force Write #
- Before COMMIT-VOTE
- (because cohort need to ask for outcome if crashed)
- Before ACK
- (because coordinator might forget outcome after ACK)
Protocol Database #
- Transactions
- cohorts & state:
- committed, aborted, active
- ACK, not ACK
Coordinator Activity #
- Coordinator force result to disk before sending ``
- Write END after all cohorts ACK (not force)
Conclusion #
- coordinator
- 2 log write, 1 forced
- 2 messages
- cohort
- 2 log write, all forced
- 2 messages
Presumed Abort #
- No log if transaction aborted
- No ack for
ABORT - Message count same as PrN
Presumed Commit #
- Coordinator force write when init
- Remove when complete
- Cohort force prepare, but non-force write before commit
- because forgetting = commit
- coordinator (when commit)
- 2 log write, 2 forced
- 2 messages
- cohort
- 2 log write, 1 forced
- 1 messages
Read-only Transaction #
- Coordinator sent
PREPARE- PrA: no log writes
- because data not forced write, forget = abort
- PrC: 2 write, 1 force
- 1 when init
- 1 to mark it delete
- Cohorts send
READ-ONLY-VOTE
PrC Optimization #
- Maintain
IN- Store permanently
- Might not have initiated
- Assume abort
IN = REC - (COM & REC)
- COM
- REC
- $REC = {tid | tid_l < tid < tid_h}$
- tid_stable
- Recovering IN
- tid_h
- Method 1: set tid_h = tid_stable + fixed amount
- Method 2: dynamic set tid_h but log to disk
- tid_l
- if oldest transaction: increment tid_l and log to disk
- COM & REC
- Scan from tid_h to tid_l and check if committed
- store in bit vector or list
nPRC Protocol
Abort #
- Coordinator send
PREPARE - Cohort send
COMMIT-VOTE, one send ABORT-VOTE - Coordinator send
ABORT - Cohort send
ACK - Coordinator possibly write increase tid_l
- 4 msgs, 1 soft write
Update #
- Coordinator send
PREPARE - Cohort send
COMMIT-VOTE - Coordinator send
COMMIT - Coordinator write increase tld_l & commit
- 3 msgs, 1 force write
Read Only #
- Coordinator send
PREPARE - Cohort send
READ-ONLY-VOTE - 2 msgs
Recalcitrant Transaction #
- Transaction too long (or cohort crash)
- Fall back to PrC for that transaction
Garbage Collect #
- Maintain all corhort
- Send
ABORT to all
comments powered by