2009/8/14 Itagaki Takahiro <itagaki.takah...@oss.ntt.co.jp> > > Heikki Linnakangas <heikki.linnakan...@enterprisedb.com> wrote: > > > Quite aside from the requirement for on-commit trigger, how exactly > > would you use 2PC with the remote database? When would you issue PREPARE > > TRANSACTION, and when would COMMIT PREPARED? What if the local database > > crashes in between - is the remote transaction left hanging in prepared > > state? > > I'm thinking prepareing remote transactions just before commit the local > transaction in CommitTransaction(). The pseudo code is something like: > > 1. Fire deferred triggers and do works for just-before-commit. > 2. AtEOXact_dblink() > => prepare and commit remote transactions. > 3. HOLD_INTERRUPTS() > We cannot rollback the local transaction after this. > 4. do works for commit > > If we need more robust atomicity, we could use 2PC against the local > transaction if there some remote transactions. i.e., expand COMMIT > command into PREPARE TRANSACTION and COMMIT PREPARED internally: > > 1. Fire deferred triggers and do works for just-before-commit. > 2. AtEOXact_dblink_prepare() -- prepare remotes > 3. PrepareTransaction() -- prepare local > 4. AtEOXact_dblink_commit() -- commit remotes > 5. FinishPreparedTransaction(commit) -- commit local > > I'm using deferrable after trigger for the purpose in my present > prototype, and it seems to work if the trigger is called at the > end of deferrable event and local backend doesn't crash in final > works for commit -- and we have some should-not-failed operations > in the final works already (flushing WAL, etc.). >
You're completely missing the point. You need to be prepared for a crash at any point in the sequence, and still recover into a coherent state where all the local and remote transactions are either committed or rolled back. Without some kind of a recovery system, you can end up in a situation where some transactions are already committed and others rolled back. 2PC makes it possible to write such a recovery system, but using 2PC alone isn't enough to guarantee atomicity. In fact, by using 2PC without a recovery system you can end up with a transaction that's prepared but never committed or aborted, requiring an admin to remove it manually, which is even worse than not using 2PC to begin with. -- Heikki Linnakangas EnterpriseDB http://www.enterprisedb.com