geronimo-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "ext2" <x...@tongtech.com>
Subject Re: Cannot using Geronimo to execute bean-managed transaction with oracle transaction more than once, but Glassfish does
Date Wed, 06 Jan 2010 11:05:29 GMT
The problem is caused by tranql-commons-connector is not compatible with
Oracle 9i 's XA API.  The details things happened as following description.

When the XA transaction finished, the ManagedXAConnection(tranql) will be
cleanup and put back to the pool. While cleanup the ManagedXAConnection,
tranql reset the associated physical connection 's auto commit to true. 
Because at this time, Transaction Manager has finished the XA transaction,
so reset the commit to true will acceptable by Oralce's XA driver;

So unfortunately this will cause  the XA resource cannot be enlist into
transaction next time. and you can only execute the xa-transaction only
once;

-----Original -----
Sender: xuhongbo [mailto:xuhb@tongtech.com] 
Date: 2009-12-30 17:15
Receiver: user@geronimo.apache.org
Subject: Re: Reply: Cannot using Geronimo to execute bean-managed
transaction with oracle transaction more than once, but Glassfish does

Hi Jack Cai:

I have tried, the "tranql-connector-oracle-local" is ok, but it doesn’t use
xa transaction in jta, and use a faked Local-XAResource instead of real
oracle-xa-resource;

I  am sorry to mis-understand your means and give the run-time class name in
my previous reply;  The error occurred program is just using "
tranql-connector-oracle-xa"

Additionally, I have try another Mysql database and using "
tranql-connector-mysql-xa" do real xa transaction. It works well. 

So my mind changed, maybe there is something not compatible with oracle 9i
database; In my original mail, I have post a very simple program which use
the Geronimo Transaction Manager and Oracle XA API directly, this works
well; 

Because tranql resource adaptor is a very simple wrapper , Geronimo does
additional things to wrap the database connection (etc control pooling,
xa-resource wrap, xa-resource cache for transaction-manager ...) , so I am
wondering if there is some other un-excepted database operation has been
done and cause this problem? for convenience I post the simple program
again. 
 
If  we only concern database operation, does this simple program done
exactly like the Geronimo done ? Or it doesn't , Geronimo do additional
things... maybe the difference will be the real reason cause the problem;
I have tracked at runtime, but unfortunately has not find some difference
yet...

Thanks a lot 
xuhongbo


-----origin-----
sender: Jack Cai [mailto:greensight@gmail.com] 
date: 2009/12/30 11:45
receiver: user@geronimo.apache.org
subject: Re: Reply: Cannot using Geronimo to execute bean-managed
transaction with oracle transaction more than once, but Glassfish does

Can you try to use the tranql-connector-oracle-xa or
tranql-connector-oracle-local to do the test?

-Jack

On Wed, Dec 30, 2009 at 11:26 AM, xuhongbo <xuhb@tongtech.com> wrote:
>
>>>In the future it would be great if you could only post to one mailing
>>>list.
> Thanks, I know
>
>>>I'm not sure what is wrong yet, however you should never try to set
>>>the autocommit state of a connection that is enlisted in a jta
>>>transaction.  Enlisting and delisting the XAConnection will result in
>>>the autocommit being dealt with properly.  The value from
>>>getAutoCommit may or may not be meaningful in a jta transaction.
>>>Outside a jta transaction the autocommit state defaults to true.  I'm
>>>quite surprised you didn't get a more informative error.
>
> Yes you are right, auto commit has no means for jta connection and cannot
be
> set to true; here I just set auto commit to false, so a jta connection
> should just omit it;
> But the surprise thing is if I doesn't affect auto commit state(in the
> program, just comment the statement "setAutocommit(false)"), when execute
> database operation,  a "ORA-02089: COMMIT ..." exception  will be throwed
by
> oracle's database driver; it looks like the Geronimo does a wrong things
> "commit on the connection when execute database operation"; and this
should
> only occurs on non-jta connection, because only no-jta connection will set
> auto commit default to true.
>
>>>One important piece of information that I don't see is which tranql
>>>wrapper you used to deploy your datasource.
>
> The datasource  is org.tranql.connector.jdbc.DataSource. And it use  a  a
> managed-connection factory " org.tranql.connector.oracle.XAMCF" to open
> connection; And the managed-connection factory use a oracle's xa
datasource
> (oracle.jdbc.xa.client.OracleXADataSource);
>
> By the way , I haven't ever post a trivial problem I have meet when I
deploy
> the Oracle-XA data source. The trivial thing is: I must change the deploy
> plan created by Geronimo's web manage console tools,   delete the empty
> property "TNSEntryName" and manually deploy it; because this is the
oracle9i
> database driver's question --- "a empty string value(not a null value) set
> to TNSEntryName" will cause oracle9i's database driver to omit the other
> property (etc serverName, serviceName ...) and cannot establish a connect
;
> I thinks this should have no means to the transaction commit failure; but
> maybe it would give some other useful things help to find out the reason.
>
> Thanks a lot
> xuhongbo
>
> -----origin -----
> sender: David Jencks [mailto:david_jencks@yahoo.com]
> date: 2009/12/30 1:43
> receiver: user@geronimo.apache.org
> subject: Re: Reply: Cannot using Geronimo to execute bean-managed
> transaction with oracle transaction more than once, but Glassfish does
>
> In the future it would be great if you could only post to one mailing
> list.
>
> I'm not sure what is wrong yet, however you should never try to set
> the autocommit state of a connection that is enlisted in a jta
> transaction.  Enlisting and delisting the XAConnection will result in
> the autocommit being dealt with properly.  The value from
> getAutoCommit may or may not be meaningful in a jta transaction.
> Outside a jta transaction the autocommit state defaults to true.  I'm
> quite surprised you didn't get a more informative error.
>
> One important piece of information that I don't see is which tranql
> wrapper you used to deploy your datasource.
>
> thanks
> david jencks
>
> On Dec 29, 2009, at 3:48 AM, xuhongbo wrote:
>
>> Hi:
>>       Yet I haven't find the real reason , I have noticed another thing
>> about the problem;
>>        The original test program will throw exception while transaction
>> commit; but if  I comment the statement
>> "connection.setAutoCommit(false); ".
>> the exception will throws while execute prepare statement; and
>> exception
>> changed as "ORA-02089: COMMIT doesn't allowed in sub transaction"
>> which
>> raised by oracle's driver;
>>       It seems the connection 's auto commit is default set to true; so I
>> am wondering while secondly execute the trasaction , a no-
>> transaction data
>> source (not a transactional-datasource) is returned?
>>
>> -----origin-----
>> Sender: xuhongbo [mailto:xuhb@tongtech.com]
>> Date: 2009/12/29 12:53
>> Receiver: dev@geronimo.apache.org
>> CC: user@geronimo.apache.org
>> Subject: Cannot using Geronimo to execute bean-managed transaction
>> with
>> oracle transaction more than once, but Glassfish does
>>
>> Hi:
>>       When I using bean  managed transaction with oracle-xa , I found
that
>> it cannot execute more than once; the first time, things is right and
>> database is update; but if execute once again a oracle- xa-warning
>> and a
>> Geronimo exception occurs; the warning and exception is list at the
>> end of
>> this mail;
>>
>>       The Geronimo Version I used is 2.1.4; and oracle version is 9i;
>>
>>       I have use another app-server GlassFish test the same program, and
>> it works well; My test program is list in the attachments:
>> MyStatelessSessionBean.java is the ejb, and MyServlet is a servlet
>> call the
>> ejb;
>>
>>       The oracle xa datasource 's plan is also list in attachments; I am
>> not sure about if I miss configured the datasource some-where; but The
>> datasource does works: I can test it and execute a query through the
>> Geronimo's console;
>>
>>       Although the oracle 's version is older, but I doesn't thinks the
>> database is not compatible with Geronimo's XA process; To ensure
>> this, I
>> write a simple test case  which use the Geronimo's Transaction
>> Manager and
>> Oralce's XA API directly; the simple test case works well; The
>> simple test
>> case is also list in the list;
>>        In the simple test case I doesn't use the UserTransaction but
>> direct use the Geronimo's TransactionManager, because when debugging
>> the
>> my-application, I found the UserTransaction is provided by OpenEJB,
>> and it
>> just wrap the Geronimo's Transaction Manager;
>>
>>       Finally , I guess if the tranql provided XADatasource is not
>> compatible with my application. So I try the following calling
>> sequence, but
>> they both occurs same problem;
>>       1:open-connection-->begin-trans-->do-update-->
end-trans->close-conn
>>      
2:begin-trans-->open-connection-->do-update-->end-trans->close-conn;
>>       3:begin-trans->open-connection-->do-update-->close-conn->end-trans;
>>
>>       Now I have no idea about this problem, so I hope if anyone can
>> help-me to check this problem
>>       Thanks for any-suggestion;
>> =
>> =
>> =
>> =
>> =
>> ======================================================================
>> Orcla XA Warning is:
>> 009-12-25 19:39:00,500 WARN  [Transaction] Unable to enlist XAResource
>> org
>> .apache.geronimo.transaction.manager.WrapperNamedXAResource@1e7dc51,
>> errorCode: -3
>> oracle.jdbc.xa.OracleXAException
>>       at
>> oracle.jdbc.xa.OracleXAResource.checkError(OracleXAResource.java:1157)
>>       at
>> oracle.jdbc.xa.client.OracleXAResource.start(OracleXAResource.java:
>> 295)
>>       at
>> org
>> .apache
>> .geronimo.transaction.manager.WrapperNamedXAResource.start(Wrapper
>> NamedXAResource.java:86)
>>       at
>> org
>> .apache
>> .geronimo.transaction.manager.TransactionImpl.enlistResource(Trans
>> actionImpl.java:209)
>>       at
>> org
>> .apache
>> .geronimo.connector.outbound.TransactionEnlistingInterceptor.getCo
>> nnection(TransactionEnlistingInterceptor.java:54)
>>       at
>> org
>> .apache
>> .geronimo.connector.outbound.TransactionCachingInterceptor.getConn
>> ection(TransactionCachingInterceptor.java:87)
>>       at
>> org
>> .apache
>> .geronimo.connector.outbound.ConnectionHandleInterceptor.getConnec
>> tion(ConnectionHandleInterceptor.java:43)
>>       .......
>>       at java.lang.Thread.run(Unknown Source)
>>
>> Geronimo Exception is:
>> javax.transaction.RollbackException: Unable to commit: transaction
>> marked
>> for rollback
>>       at
>> org
>> .apache
>> .geronimo.transaction.manager.TransactionImpl.rollbackResourcesDur
>> ingCommit(TransactionImpl.java:671)
>>       at
>> org
>> .apache
>> .geronimo.transaction.manager.TransactionImpl.commit(TransactionIm
>> pl.java:270)
>>       at
>> org
>> .apache
>> .geronimo.transaction.manager.TransactionManagerImpl.commit(Transa
>> ctionManagerImpl.java:250)
>>       at
>> org
>> .apache
>> .openejb.core.CoreUserTransaction.commit(CoreUserTransaction.java:
>> 62)
>>       at
>> org.apache.openejb.core.BaseContext
>> $UserTransactionWrapper.commit(BaseContex
>> t.java:194)
>>       at
>> sampleear
>> .MyStatelessSessionBean.sayHello(MyStatelessSessionBean.java:40)
>>       ......
>>       at java.lang.Thread.run(Unknown Source)
>>
>>
>>
>>
>>
>>
>
>
>
>






Mime
View raw message