Re: eXtensible Transaction Manager API

From: Simon Riggs <simon(at)2ndQuadrant(dot)com>
To: Konstantin Knizhnik <k(dot)knizhnik(at)postgrespro(dot)ru>
Cc: Michael Paquier <michael(dot)paquier(at)gmail(dot)com>, Amit Kapila <amit(dot)kapila16(at)gmail(dot)com>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: eXtensible Transaction Manager API
Date: 2015-11-08 19:33:54
Message-ID: CANP8+jJDc6VvkgpNX+1ahe6h8CLQ2g-284b+QgjmhBT-yFNfNQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 8 November 2015 at 16:59, Konstantin Knizhnik <k(dot)knizhnik(at)postgrespro(dot)ru>
wrote:

> On 11/08/2015 02:46 PM, Michael Paquier wrote:
>
>> On Sun, Nov 8, 2015 at 1:53 AM, Konstantin Knizhnik wrote:
>>
>>> In tsDTM approach two phase commit is performed by coordinator and
>>> currently
>>> is using standard PostgreSQL two phase commit:
>>>
>>> Code in GO performing two phase commit:
>>>
>>> exec(conn1, "prepare transaction '" + gtid + "'")
>>> exec(conn2, "prepare transaction '" + gtid + "'")
>>> exec(conn1, "select dtm_begin_prepare($1)", gtid)
>>> exec(conn2, "select dtm_begin_prepare($1)", gtid)
>>> csn = _execQuery(conn1, "select dtm_prepare($1, 0)", gtid)
>>> csn = _execQuery(conn2, "select dtm_prepare($1, $2)", gtid,
>>> csn)
>>> exec(conn1, "select dtm_end_prepare($1, $2)", gtid, csn)
>>> exec(conn2, "select dtm_end_prepare($1, $2)", gtid, csn)
>>> exec(conn1, "commit prepared '" + gtid + "'")
>>> exec(conn2, "commit prepared '" + gtid + "'")
>>>
>>> If commit at some of the nodes failed, coordinator should rollback
>>> prepared
>>> transaction at all nodes.
>>>
>> Not always. If COMMIT PREPARED fails at some of the nodes but succeeds
>> on others, the transaction is already partially acknowledged as
>> committed in the cluster. Hence it makes more sense for the
>> coordinator to commit transactions on the remaining nodes. Before
>> issuing any COMMIT PREPARED queries, I guess that's fine to rollback
>> the transactions on all nodes though.
>>
> We will get inconsistency if transaction is committed on some subset of
> nodes involved in transaction.
> Assume bank debit-credit example. If some distributed transaction
> transfers money from the account at one node to the account and another
> node,
> then committing transaction just at one node cause incorrect total balance.
> The main goal of DTM is to preserve ACID semantic for distributed
> transaction, so either transaction is committed at all nodes, either it is
> not committed at all.

Agreed.

COMMIT PREPARED is a pretty thin layer; the work is all done in the
PREPARE. With a DTM, the main commit itself is done once only in the DTM,
so all the COMMIT PREPARED would do is release local node resources.

--
Simon Riggs http://www.2ndQuadrant.com/
<http://www.2ndquadrant.com/>
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Noah Misch 2015-11-08 19:52:05 Re: Rework the way multixact truncations work
Previous Message Andres Freund 2015-11-08 19:11:42 Re: Rework the way multixact truncations work