Re: two-phase commit - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: two-phase commit
Date
Msg-id 200310240319.h9O3JZ329378@candle.pha.pa.us
Whole thread Raw
In response to two-phase commit  (Heikki Linnakangas <hlinnaka@iki.fi>)
List pgsql-patches
I assume you have looked at Satoshi Nagayasu's work:

    http://snaga.org/pgsql/

If not, would you work with him on something we can add to 7.5 when
development starts?

---------------------------------------------------------------------------

Heikki Linnakangas wrote:
> Hi,
>
> I saw some discussion about two-hase commits on hackers-list and wanted
> therefore to submit this patch for discussion now, although it's still a
> bit of a mess, just to let you guys know that I'm working on this.
>
> This patch adds three new commands:
>
> PREPCOMMIT <global transaction id>
>
> This performs the 1st phase. After issuing this command, the backend is
> free to begin new transactions. The given global transaction id (gid) is
> used later to do the 2nd phase commit with COMMITPREPARED.
>
> COMMITPREPARED <global transaction id>
>
> Performs the 2nd phase. This marks the transaction as committed, and
> releases any locks held.
>
> LISTPREPARED
>
> Prints a list of all transactions in prepared state to the console. You
> must currently start postmaster with -d 1 to see the output. It should of
> course return a result set, but it not quite there yet.
>
> Here's a simple way to try this out.
>
> 1. bin/postmaster -d 1
> 2. CREATE TABLE twophase (foobar int);
> 3. INSERT INTO twophase VALUES (1);
> 4. INSERT INTO twophase VALUES (2);
>
> 5. BEGIN; UPDATE twophase SET foobar = 10 WHERE foobar = 1;
> 6. PREPCOMMIT 'gid'
>
> The transaction is now in prepared state. The backend is now free to do
> something else.
>
> 7. SELECT * FROM foobar;
> 8. BEGIN; UPDATE twophase SET foobar = 11 WHERE foobar = 1;
>
> This command should block, because the previous transaction is in prepared
> state and it's still holding the lock.
>
> 9. in a new psql session: COMMITPREPARED 'gid';
>
> The update started at line 8. should now return with UPDATE 0, as the
> prepared transaction committed and took away the row with value 10.
>
> You can also try killing the postmaster after PREPCOMMIT. When you restart
> it and continue with line 8, it should still block. The locks held by the
> prepared transactions persist over shutdown/restart.
>
> Open issues:
>
> 1. No ABORTPREPARED yet. That's going to be trivial to add.
>
> 2. The only permanent information about any locks held by a prepared
> transaction is currently only kept in xlog. There is a hack in place that
> keeps the checkpointing routine from doing a checkpoint past the begin of
> any prepared transactions, which would cause that information to be lost.
> I guess a separate log like clog but for locks is needed.
>
> 3. Related to point 2, there is a race condition with the hack.
> There is probably still a lot of other locking issues and bugs as well.
>
> 4. No support for notifications, DDL stuff etc. yet.
>
> The complicated part was making the locks work right. When a
> transaction is prepared with PREPCOMMIT, all locks acquired by the backend
> are "offloaded" to another pseudo PGPROC-struct, and a record is also
> written to xlog about each lock so that they can be re-acquired if the
> server crashes before the transaction is committed. There is a new
> function called LockPersistAll in lock.c that does that.
>
> I started working on two-phase commit because I wanted to get myself
> more familiar with postgresql internals and source code. I actually
> thought that I would never get this far, but it wasn't that hard after
> all.
>
> This patch (after the open issues are solved) is enough for a Java
> Transaction API compliant resource manager implementation in the JDBC
> driver. That would allow Postgresql to be used together with a J2EE server
> and message queue software etc. I haven't looked at the X/Open
> specification yet.
>
> There has also been discussion about using 2PC to implement synchronous
> replication. To do that, you would need a global transaction manager in
> addition to this patch, but I'm personally not interested in that.
>
> I would very much appreciate any comments on this patch, and I will
> continue working on this if you agree this is the right direction. I'll be
> away for the weekend but I'll be back on Monday.
>
> - Heikki

Content-Description:

[ Attachment, skipping... ]

>
> ---------------------------(end of broadcast)---------------------------
> TIP 9: the planner will ignore your desire to choose an index scan if your
>       joining column's datatypes do not match

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

pgsql-patches by date:

Previous
From: Barry Lind
Date:
Subject: Re: Ant version detection
Next
From: Bruce Momjian
Date:
Subject: Re: [BUGS] ISM shared memory on solaris