On Tue, Jan 6, 2015 at 11:55 PM, Robert Haas <robertmh...@gmail.com> wrote:
> On Mon, Jan 5, 2015 at 3:23 PM, Tom Lane <t...@sss.pgh.pa.us> wrote: > > Well, we intentionally didn't couple the FDW stuff closely into > > transaction commit, because of the thought that the "far end" would not > > necessarily have Postgres-like transactional behavior, and even if it did > > there would be about zero chance of having atomic commit with a > > non-Postgres remote server. postgres_fdw is a seriously bad starting > > point as far as that goes, because it encourages one to make assumptions > > that can't possibly work for any other wrapper. > > Atomic commit is something that can potentially be supported by many > different FDWs, as long as the thing on the other end supports 2PC. > If you're talking to Oracle or DB2 or SQL Server, and it supports 2PC, > then you can PREPARE the transaction and then go back and COMMIT the > transaction once it's committed locally. Getting a cluster-wide > *snapshot* is probably a PostgreSQL-only thing requiring much deeper > integration, but I think it would be sensible to leave that as a > future project and solve the simpler problem first. > > > I think the idea I sketched upthread of supporting an external > transaction > > manager might be worth pursuing, in that it would potentially lead to > > having at least an approximation of atomic commit across heterogeneous > > servers. > > An important threshold question here is whether we want to rely on an > external transaction manager, or build one into PostgreSQL. As far as > this particular project goes, there's nothing that can't be done > inside PostgreSQL. You need a durable registry of which transactions > you prepared on which servers, and which XIDs they correlate to. If > you have that, then you can use background workers or similar to go > retry commits or rollbacks of prepared transactions until it works, > even if there's been a local crash meanwhile. > > Alternatively, you could rely on an external transaction manager to do > all that stuff. I don't have a clear sense of what that would entail, > or how it might be better or worse than rolling our own. I suspect, > though, that it might amount to little more than adding a middle man. > I mean, a third-party transaction manager isn't going to automatically > know how to commit a transaction prepared on some foreign server using > some foreign data wrapper. It's going to be have to be taught that if > postgres_fdw leaves a transaction in-medias-res on server OID 1234, > you've got to connect to the target machine using that foreign > server's connection parameters, speak libpq, and issue the appropriate > COMMIT TRANSACTION command. And similarly, you're going to need to > arrange to notify it before preparing that transaction so that it > knows that it needs to request the COMMIT or ABORT later on. Once > you've got all of that infrastructure for that in place, what are you > really gaining over just doing it in PostgreSQL (or, say, a contrib > module thereto)? > Thanks Robert for giving high level view of system needed for PostgreSQL to be a transaction manager by itself. Agreed completely. > > (I'm also concerned that an external transaction manager might need > the PostgreSQL client to be aware of it, whereas what we'd really like > here is for the client to just speak PostgreSQL and be happy that its > commits no longer end up half-done.) > > -- > Robert Haas > EnterpriseDB: http://www.enterprisedb.com > The Enterprise PostgreSQL Company > -- Best Wishes, Ashutosh Bapat EnterpriseDB Corporation The Postgres Database Company