I use 
DataSourceDefinition(name="java:app/SHAcc") link to 
url="jdbc:derby://localhost:1527/SHAcc",
DataSourceDefinition(name="java:app/BJAcc")link to another 
url="jdbc:derby://localhost:1527/BJAcc",
so they point to two different databases.
    The transaction can commit correctly.

    The problem appears when I call the transaction.setRollBackOnly() method, 
transaction will rollback in fact,
but the server say: 
org.apache.derby.client.am.XaException: XA_RBROLLBACK : Error executing a 
XAResource.end(), server returned XA_RBROLLBACK

2010-08-11 



lilisacat 



发件人: sghayal 
发送时间: 2010-08-11  21:03:11 
收件人: dev 
抄送: 
主题: Re: XA_RBROLLBACK Exception when using Derby in transaction.roolback() 
 
U r using wrong url. Both the url point to same database.

This is what seems to be happening. A single transaction has been started which 
is being committed twice.

If using xa u need two physically different databases.

Hope this helps.

Cheers,

Sandip 
Sent from my “contract free” BlackBerry® smartphone on the WIND network.



From: "lilisacat" <[email protected]> 
Date: Wed, 11 Aug 2010 15:15:41 +0800
To: dev<[email protected]>
ReplyTo: [email protected] 
Subject: XA_RBROLLBACK Exception when using Derby in transaction.roolback()


Hi,
    I encournter a problem when run the app in the G-3.0-SANPSHOT.
    In the app, I used Datasource DS-A and Datasource DS-B to link two derby 
database. 
If UserTransaction.rollback() called, the server occured error:
org.apache.derby.client.am.XaException: XA_RBROLLBACK : Error executing a 
XAResource.end(), server returned XA_RBROLLBACK. 
    
Here is the details of two Datasource:
//DataSourceSH
@DataSourceDefinition(name="java:app/SHAcc",
   className="org.apache.derby.jdbc.ClientXADataSource",
   url="jdbc:derby://localhost:1527/SHAcc",
   user="system",
   databaseName="SHAcc",
   transactional=true,
   maxPoolSize=10,
   properties = {"createDatabase = create"})
//DataSourceBJ
@DataSourceDefinition(name="java:app/BJAcc",
   className="org.apache.derby.jdbc.ClientXADataSource",
   url="jdbc:derby://localhost:1527/BJAcc",
   user="system",
   databaseName="BJAcc",
   transactional=true,
   maxPoolSize=10,
   properties = {"createDatabase = create"})

In the Servlet, I used two datasources as following:
Context initContext = new InitialContext();
tx = (UserTransaction)initContext.lookup("java:comp/UserTransaction");
// Start a transaction
// First, use DataSourceSH
ds = (javax.sql.DataSource) initContext.lookup("java:app/SHAcc");
//get connection with database: SHAcc
//do some update on database: SHAcc
if(failFlag)
            {tx.setRollBackOnly();}
// Second, use DataSourceBJ 
ds = (javax.sql.DataSource) initContext.lookup("java:app/BJAcc");
//get connection with database: BJAcc
//do some update on database: BJAcc
// commit all the operations
tx.commit();
}
        catch(Exception e){
if(tx!=null){
try{
// rollback the operations
tx.rollback();
System.out.println("catch: roll back success.");}
catch(Exception e1){
System.out.println("catch: roll back fail.");}
}
System.out.println("catch: " + e.getClass() + "; " + e.getMessage()+"");
}......

    I have no idea why Error executing a XAResource.end() if tx.rollback() 
happens?

 Thanks !
2010-08-11 



Lisa

Reply via email to