On 2016/10/13 19:37, Ashutosh Bapat wrote: >> In case we can not reach a foreign server during post-commit phase, >> basically the transaction and following transaction should stop until >> the crashed server revived. > > I have repeatedly given reasons why this is not correct. You and Amit > seem to repeat this statement again and again in turns without giving > any concrete reasons about why this is so.
As mentioned in description of the "Commit" or "Completion" phase in the Wikipedia article [1]: * Success If the coordinator received an agreement message from all cohorts during the commit-request phase: 1. The coordinator sends a commit message to all the cohorts. 2. Each cohort completes the operation, and releases all the locks and resources held during the transaction. 3. Each cohort sends an acknowledgment to the coordinator. 4. The coordinator completes the transaction when all acknowledgments have been received. * Failure If any cohort votes No during the commit-request phase (or the coordinator's timeout expires): 1. The coordinator sends a rollback message to all the cohorts. 2. Each cohort undoes the transaction using the undo log, and releases the resources and locks held during the transaction. 3. Each cohort sends an acknowledgement to the coordinator. 4. The coordinator undoes the transaction when all acknowledgements have been received. In point 4 of both commit and abort cases above, it's been said, "when *all* acknowledgements have been received." However, when I briefly read the description in "Transaction Management in the R* Distributed Database Management System (C. Mohan et al)" [2], it seems that what Ashutosh is saying might be a correct way to proceed after all: """ 2. THE TWO-PHASE COMMIT PROTOCOL ... After the coordinator receives the votes from all its subordinates, it initiates the second phase of the protocol. If all the votes were YES VOTES, then the coordinator moves to the committing state by force-writing a commit record and sending COMMIT messages to all the subordinates. The completion of the force-write takes the transaction to its commit point. Once this point is passed the user can be told that the transaction has been committed. ... """ Sorry about the noise. Thanks, Amit [1] https://en.wikipedia.org/wiki/Two-phase_commit_protocol#Commit_phase [2] http://www.cs.cmu.edu/~natassa/courses/15-823/F02/papers/p378-mohan.pdf -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers