Re: eXtensible Transaction Manager API
От | Simon Riggs |
---|---|
Тема | Re: eXtensible Transaction Manager API |
Дата | |
Msg-id | CANP8+jJDc6VvkgpNX+1ahe6h8CLQ2g-284b+QgjmhBT-yFNfNQ@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: eXtensible Transaction Manager API (Konstantin Knizhnik <k.knizhnik@postgrespro.ru>) |
Ответы |
Re: eXtensible Transaction Manager API
|
Список | pgsql-hackers |
On 8 November 2015 at 16:59, Konstantin Knizhnik <k.knizhnik@postgrespro.ru> wrote:
--
On 11/08/2015 02:46 PM, Michael Paquier wrote:On Sun, Nov 8, 2015 at 1:53 AM, Konstantin Knizhnik wrote:We will get inconsistency if transaction is committed on some subset of nodes involved in transaction.In tsDTM approach two phase commit is performed by coordinator and currentlyNot always. If COMMIT PREPARED fails at some of the nodes but succeeds
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.
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.
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/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
В списке pgsql-hackers по дате отправления: