[
https://issues.apache.org/jira/browse/DERBY-2220?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12475103
]
Julius Stroffek commented on DERBY-2220:
----------------------------------------
>From the XA Transaction Specification from the OpenGroup:
---
It is an error, [XAER_PROTO], for a transaction manager to call xa_close ()
within a
thread of control that is associated with a transaction branch (that is, the
transaction
manager must call xa_end() before calling xa_close ()).
---
So a change proposed in a patch is against this spec. It should be possible to
close a xa network connection on the trunk but not the ebedded one. To
implement this according a spec should be:
1.) undo any changes made to embedded connection
2.) check in the network client code (ClientXAConnection) when closing a
connection to a database whether it is already associated with the global
transaction. If so, do not allow a connection to be closed.
However, from my point of view it would be clearer to allow a connection to be
closed and rollback the associated transactions. I do not know whether it would
be possible to even make the behavior against the spec in some cases but I
would like to discuss the difference.
I would expect that a transaction manager or an application would call the
XAConnection.close when it is associated with a transaction only in a
exceptional case when it 'does not know what else to do'. This could happen
after throwing an unpredictable exceptions which do not have to be handled -
like NullPointerException. The handling of such an exception usually propagates
through couple of functions in the call stack. Usually, in this case the
application do not have to know the valid xid of the transaction or it do not
have to know even whether the xa connection is associated with the transaction
or not. What the application should do?
1.) If it uses a transaction manager, the xid is stored in a transaction
manager and if it has a reference to transaction manager it can do some work
with the transaction - probably roll back
2.) If it uses XAResource and XAConnection directly, it may happen that the
application will loose xid and not the XAResource or XAConnection references
(these might be shared across the application). What to do in this case?
I am trying to think of an application with not the optimal design. This leads
me what happens if all the objects would be garbage collected? ;-)
---
Now I think that the best approach is to implement XAConnection.close according
the specs and to provide the cleanup with rollback of transactions in
XAConnectionImpls.finalize methods (as it is implemented now in close methods
of the patch). I checked the code for this fastly and it looks like it is not
handled this way. I'll check this in more detail and I'll create a new jira
issue to address this separately.
> Uncommitted transactions executed throught XAResource will held locks after
> the application terminates (or crashes during the transaction).
> -------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: DERBY-2220
> URL: https://issues.apache.org/jira/browse/DERBY-2220
> Project: Derby
> Issue Type: Bug
> Affects Versions: 10.3.0.0
> Environment: Solaris Nevada build 49, Sun's JDK1.6
> Reporter: Julius Stroffek
> Assigned To: Julius Stroffek
> Attachments: d2220_beta.diff, d2220_beta2.diff, d2220_try1.diff,
> d2220_try1.stat, d2220_try2.diff, d2220_try2.stat, XATranTest.java, xxx.sql
>
>
> Using this piece of code derby will not release a table lock of 'dummy' table.
> String query = "insert into dummy (field1) values ('" +
> Integer.toString(value) + "')";
> XAConnection xaConnection =
> createXAConnection("jdbc:derby://localhost:1527/TestDB", "", "");
> XAResource xaResource = xaConnection.getXAResource();
> conn = xaConnection.getConnection();
>
> Xid xid = createXid(value);
> xaResource.setTransactionTimeout(10);
> xaResource.start(xid, XAResource.TMNOFLAGS);
>
> Statement statement = conn.createStatement();
> statement.execute(query);
>
> // terminate the client application
> // this will not release any locks
> System.exit(0);
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.