[ 
https://issues.apache.org/jira/browse/DERBY-1016?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12742952#action_12742952
 ] 

Tiago R. Espinha commented on DERBY-1016:
-----------------------------------------

I have been discussing this issue with Kathey and Myrna on IRC and it is 
generally hard to reach an optimal behavior, mostly because the XA 
specification is too vague and not very clear on this issue.

On MySQL for example, we are able to invoke a forget on a transaction right 
after we start it, whereas this is not possible in DB2. Also, running the 
attached repro against MySQL makes it fail with XAER_RMFAIL:
XAER_RMFAIL: The command cannot be executed when global transaction is in the  
ACTIVE state

Still, since we don't have heuristic transactions in Derby, forget will always 
return an error and never really succeed. This way, we thought the best 
behavior is to throw XAER_NOTA (not a transaction) whenever the XID doesn't 
exist and throw XAER_PROTO for all the cases where the XID exists.

Should no one object to this change, I'll create a patch and go through with it.

> javax.transaction.xa.forget (Xid) raises XAER_NOTA exception instead of 
> XA_PROTO on a prepared transaction
> ----------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-1016
>                 URL: https://issues.apache.org/jira/browse/DERBY-1016
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 10.1.3.1, 10.2.1.6
>            Reporter: Kathey Marsden
>            Assignee: Tiago R. Espinha
>         Attachments: DERBY-1016.patch, DERBY-1016.patch, 
> DERBY-1016_Patch_1.diff, ReproDerby1016.java, utilXid.java
>
>
> javax.transaction.xa.forget (Xid) raises XAER_NOTA exception instead of 
> XA_PROTO on a prepared transaction
> I posted a question to derby-dev about this and heard no response so am 
> assuming it is indeed a bug.
>  in  the  XA+ 
> specification, it seems like xa_forget should  only be valid for a
> heuristically completed transaction, so should  be  XAER_PROTO
> and not XAER_NOTA.
> In xaStateTran.sql we have this case:
> -- get back into prepared state
> xa_start xa_noflags 50;
> insert into xastate values(2);
> xa_end xa_success 50;
> xa_prepare 50;
> select * from global_xactTable where gxid is not null order by gxid;
> -- the following should error XAER_NOTA
> xa_forget 50;
> The user  code I am looking at handles forget like this. They expect 
> XAER_PROTO in this case.
>               
> try {
>              xaRes.forget(xidList[i]);
>               System.out.print("XA-Transaction [" + (i+1) + "]
> Forgotten. \n" );
> } catch (XAException XAeForget) {
>                         if ( XAeForget.errorCode ==
> XAException.XAER_PROTO ) {
>                             System.out.print("XA-Transaction [" + (i+1)
> + "] not heuristically completed yet - Rolling Back instead. \n" );
>                             xaRes.rollback(xidList[i]);
>                             System.out.print("XA-Transaction [" + (i+1)
> + "] Rolled Back. \n" );
>                         }
>                         if ( XAeForget.getMessage() != null ) {
>                             System.out.println("XAException " +
> XAeForget.getMessage() );
>              

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to