Calling datasource.getConnection() after sessionContext.setR
alexfdt Aug 1, 2008 11:23 AMHello.
I am adapting an old application which worked on JBOSS 2.1 to the new JBOSS server version.
Now I am using JBOSS 5.0.0.Beta4.
There is a code in the application which acts like the following (simplified):
javax.ejb.SessionContext sessionContext = ...; ... if (somethingGoesWrong()) { sessionContext.setRollbackOnly(); //Then get connection to the DB javax.sql.DataSource dataSource = ....; java.sql.Connection con = dataSource.getConnection(); //and execute a query ... }
The following exception is thrown when "dataSource.getConnection()" executes:
org.jboss.util.NestedSQLException: Transaction is not active: tx=TransactionImple < ac, BasicAction: -3f57fffe:745:48918030:537 status: ActionStatus.ABORT_ONLY >; - nested throwable: (javax.resource.ResourceException: Transaction is not active: tx=TransactionImple < ac, BasicAction: -3f57fffe:745:48918030:537 status: ActionStatus.ABORT_ONLY >) at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:94)
Is it a JBOSS bug or such code really should not work?
I tried to debug using JBOSS sources. The exception is thrown from org.jboss.resource.connectionmanager.TxConnectionManager:
public ConnectionListener getManagedConnection(Subject subject, ConnectionRequestInfo cri) throws ResourceException { Transaction trackByTransaction = null; try { Transaction tx = tm.getTransaction(); if (tx != null && TxUtils.isActive(tx) == false) throw new ResourceException("Transaction is not active: tx=" + tx); ...
So if transaction is not in Status.STATUS_ACTIVE (TxUtils.isActive(tx)) then throw an exception.
Link to current source:
http://viewvc.jboss.org/cgi-bin/viewvc.cgi/jbossas/trunk/connector/src/main/org/jboss/resource/connectionmanager/TxConnectionManager.java?revision=76091&view=markup
Older version of this class used another check method:
... if (trackConnectionByTx && tm.getStatus() != Status.STATUS_NO_TRANSACTION) tx = tm.getTransaction(); ...
Link to older source:
http://viewvc.jboss.org/cgi-bin/viewvc.cgi/jbossas/trunk/connector/src/main/org/jboss/resource/connectionmanager/TxConnectionManager.java?revision=30026&view=markup
If transaction is not in Status.STATUS_NO_TRANSACTION then it is ok.
Older version of TxUtils.isActive(Transaction tx) was also functioning in the different way.
Old: TxUtils.isActive() returns true if the transaction is in Status.STATUS_ACTIVE or Status.STATUS_MARKED_ROLLBACK.
Current: TxUtils.isActive() returns true if the transaction is in Status.STATUS_ACTIVE.
All these changes were made corresponding to this issue: https://jira.jboss.org/jira/browse/JBAS-1916.
TxUtils.isActive() - it is ok. But I can not understand why TxConnectionManager changed to the way it works now.
If I did not read some documentation please direct me to it.
Thanks for all people who will answer something or even read this to the end. :)