Re: 2PC transaction id

Поиск
Список
Период
Сортировка
От Heikki Linnakangas
Тема Re: 2PC transaction id
Дата
Msg-id Pine.OSF.4.61.0507011205460.475909@kosh.hut.fi
обсуждение исходный текст
Ответ на 2PC transaction id  (Dave Cramer <pg@fastcrypt.com>)
Ответы Re: 2PC transaction id  (Oliver Jowett <oliver@opencloud.com>)
Список pgsql-hackers
On Fri, 1 Jul 2005, Oliver Jowett wrote:

> Heikki Linnakangas wrote:
>
>> branch id: Branch Identifier. Every RM involved in the global
>> transaction is given a *different* branch id.
>
> Hm, I am confused then -- the XA spec definitely talks about enlisting
> multiple RMs in a single transaction branch.
>
> Can you explain?

I oversimplified a bit. The TM *can* enlist multiple threads of control (= 
connection in JTA) to the same transaction branch. That's called 
"tightly-coupled threads", and they should then be treated as one 
local transaction in the RM. The calls will look like this:

conn1.start(xid1, TMNOFLAGS);
...
conn2.start(xid1, TMJOIN);
...
conn1.end(xid1, TMSUCCESS);
...
conn2.end(xid1, TMSUCCESS);

connX.prepare(xid1);
connX.commit(xid1, false);

conn1 and conn2 must share locks and see each others changes. They 
mustn't deadlock each other. The JDBC driver can implement this in a very 
straight-forward way by using the same physical connection for both conn1 
and conn2. Note that there's only one prepare, and it can be issued using 
any connection.

The other possibility is called "loosely-coupled threads". In this case 
the calls look like this:

conn1.start(xid1, TMNOFLAGS);
...
conn2.start(xid2, TMNOFLAGS);
...
conn1.end(xid1, TMSUCCESS);
...
conn2.end(xid2, TMSUCCESS);
...
connX.prepare(xid1);
connX.prepare(xid2);
connX.commit(xid1, false);
connX.commit(xid2, false);

xid1 and xid2 can belong to the same global transaction, but different 
branches. The RM doesn't need to care both branches belong to the same 
global transactions, xid1 and xid2 can be treated just like any random 
two transactions. They can deadlock each other, and they won't see each 
others changes before commit. This can be implemented in the JDBC driver 
by using two physical connections.

So the example given earlier in this thread, with one transaction branch 
but two prepare-calls makes no sense. The RM should throw an exception 
if the TM calls start twice with the same XID, and TMJOIN flag is not 
given. One transaction branch  maps in 1:1 fashion to one RM local 
transaction.

I hope this helps...

- Heikki


В списке pgsql-hackers по дате отправления:

Предыдущее
От: Peter Eisentraut
Дата:
Сообщение: Re: Occupied port warning
Следующее
От: Oliver Jowett
Дата:
Сообщение: Re: 2PC transaction id