UserTransaction.rollback still associated with current threa
pbrewer_uk Dec 1, 2009 6:26 AMI'm using JBoss AS 5.1.0.GA (with Seam 2.2.0.GA) and have a SLSB with Bean Managed Transactions and I cannot start a new tx after a rollback.
When I call userTransaction.rollback() and then later want to call userTansaction.begin() - but after the call to rollback, I would expect the tx status to be 6 (i.e. no tx) however the tx status is actually 1 (i.e. javax.transaction.Status.STATUS_MARKED_ROLLBACK). So, this means I cannot start a new tx after rolling back the previous transaction.
According to the UserTansaction API, calling rollback should:
"Roll back the transaction associated with the current thread. When this method completes, the thread is no longer associated with a transaction."
I also noticed https://jira.jboss.org/jira/browse/JBAS-6116, which is closed, but seems to match what is happening.
Am I doing something wrong? I've included some code extracts below...
Any help on this would be greatly appreciated,
thanks, Pete.
ArchiveBean.java
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
@Name("archive")
public class ArchiveBean extends TransactionalSessionBean implements Archive {
public void archiveData() {
try {
beginTransaction(300);
boolean error = true ; // would normally doSomeWork() here.
if (error) {
rollbackTransaction() ;
} else {
commitTransaction() ;
}
beginTransaction() ; // Error occurs here as tx Status is 1
...
} finally {
cleanupTransaction() ;
}
}
}
TransactionalSessionBean.java
public class TransactionalSessionBean extends Controller {
@Resource
private UserTransaction userTransaction;
protected void beginTransaction(int timeout) throws TransactionException {
Integer txStatus = null;
try {
txStatus = userTransaction.getStatus();
userTransaction.setTransactionTimeout(timeout);
userTransaction.begin();
} catch (SystemException ex) {
throw new TransactionException("Error starting a new transaction.", ex);
} catch (NotSupportedException ex) {
throw new TransactionException("A new transaction is not supported.", ex);
}
}
protected void rollbackTransaction() throws TransactionException {
Integer txStatus = null;
try {
txStatus = userTransaction.getStatus();
if (txStatus == Status.STATUS_ACTIVE) {
userTransaction.rollback();
} else if (txStatus == Status.STATUS_ROLLING_BACK || txStatus == Status.STATUS_ROLLEDBACK || txStatus == Status.STATUS_MARKED_ROLLBACK) {
getLog().debug("Not rolling-back tx - it's is already rolled-back, rolling back or marked for rollback. Tx status: " + txStatus);
} else {
throw new TransactionException("Cannot rollback a transaction that is not active (tx status " + txStatus + ").");
}
} catch (SystemException ex) {
throw new TransactionException("Error rolling back the current transaction.", ex);
} catch (SecurityException ex) {
throw new TransactionException("Rolling back a transaction is not permitted.", ex);
} catch (IllegalStateException ex) {
throw new TransactionException("Error rolling back a transaction.", ex);
}
}
}