On Wed, Jan 7, 2015 at 9:50 PM, Kevin Grittner <kgri...@ymail.com> wrote:

> Ashutosh Bapat <ashutosh.ba...@enterprisedb.com> wrote:
>
> > I don't see why would my patch cause inconsistencies. It can
> > cause dangling PREPAREd transactions and I have already
> > acknowledged that fact.
> >
> > Am I missing something?
>
> To me that is the big problem.  Where I have run into ad hoc
> distributed transaction managers it has usually been because a
> crash left prepared transactions dangling, without cleaning them up
> when the transaction manager was restarted.  This tends to wreak
> havoc one way or another.
>
> If we are going to include a distributed transaction manager with
> PostgreSQL, it *must* persist enough information about the
> transaction ID and where it is used in a way that will survive a
> subsequent crash before beginning the PREPARE on any of the
> systems.


Thanks a lot. I hadn't thought of this.


> After all nodes are PREPAREd it must flag that persisted
> data to indicate that it is now at a point where ROLLBACK is no
> longer an option.  Only then can it start committing the prepared
> transactions.  After the last node is committed it can clear this
> information.  On start-up the distributed transaction manager must
> check for any distributed transactions left "in progress" and
> commit or rollback based on the preceding; doing retries
> indefinitely until it succeeds or is told to stop.
>
>
Agreed.


> Doing this incompletely (i.e., not identifying and correctly
> handling the various failure modes) is IMO far worse than not
> attempting it.  If we could build in something that did this
> completely and well, that would be a cool selling point; but let's
> not gloss over the difficulties.  We must recognize how big a
> problem it would be to include a low-quality implementation.
>
> Also, as previously mentioned, it must behave in some reasonable
> way if a database is not configured to support 2PC, especially
> since 2PC is off by default in PostgreSQL.
>
>
I described one possibility in my reply to Tom's mail. Let me repeat it
here.

We can have a per foreign server option, which says whether the
corresponding server is able to participate in 2PC. A transaction spanning
multiple foreign server with at least one of them not capable of
participating in 2PC will be aborted.

Will that work?

In case a user flags a foreign server as capable to 2PC incorrectly, I
expect the corresponding FDW would raise error (either because PREPARE
fails or FDW doesn't handle that case) and the transaction will be aborted
anyway.


> --
> Kevin Grittner
> EDB: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>



-- 
Best Wishes,
Ashutosh Bapat
EnterpriseDB Corporation
The Postgres Database Company

Reply via email to