A no vote permits abort in this tiny two-phase commit FSM.

highlighted = computed this step

Abort on no vote

In this tiny model, an abort decision is valid only when at least one participant has voted no. A no vote changes the final participant states together.

no vote permits abort\text{no vote permits abort}

Abort transition

The replay records 2 votes, including 1 no vote, and ends with 3 aborted participants.

votes=2,no votes=1,aborted=3\text{votes}=2,\quad \text{no votes}=1,\quad \text{aborted}=3

two-phase commit is rendered here as a tiny exact FSM trace; timeouts, recovery, network partitions, availability, and database-product behavior are out of scope.

No vote abortseventcoordinatordecisionvotesparticipantsinitialinitpendingnoneP1:init, P2:init, P3:initprepare CwaitingpendingnoneP1:prepared, P2:prepared, P3:preparedvote P1 yeswaitingpendingP1:yesP1:voted_yes, P2:prepared, P3:preparedvote P2 nowaitingpendingP1:yes, P2:noP1:voted_yes, P2:voted_no, P3:prepareddecide abortabortedabortP1:yes, P2:noP1:aborted, P2:aborted, P3:aborted participant statesparticipantvotestateP1yesabortedP2noabortedP3noneaborted compiled summaryfactvaluedecisionabortoutcomeabortcoordinatorabortedcommitAllowednoabortReasonno_vote

Summary

Abort is also guarded by the replayed votes. Note: presumed-abort variants and recovery choices are intentionally not represented.

abort is guarded by no vote\text{abort is guarded by no vote}