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
- 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