[
http://jira.jboss.com/jira/browse/JBSEAM-2309?page=all ]
Norman Richards closed JBSEAM-2309.
-----------------------------------
Fix Version/s: 2.1.0.BETA1
Resolution: Done
I've taken the suggestion of checking the TX status before rolling back. The patch
contained another suggestion for checking the tx status before a commit. I'll need a
bit of convincing on that one. It seems to me that we would want an exception thrown in
that case. The patch looks like it would silently ignore the error. I you think it's
an important issue, please open a new JIRA for it and explain a bit more what is wrong.
UserTransaction.commit() may throw a RollbackException(), in that
case don't try to perform a UserTransaction.rollback()
------------------------------------------------------------------------------------------------------------------------
Key: JBSEAM-2309
URL:
http://jira.jboss.com/jira/browse/JBSEAM-2309
Project: JBoss Seam
Issue Type: Bug
Components: Core
Affects Versions: 1.2.1.GA, 2.0.0.GA
Reporter: Denis Forveille
Assigned To: Norman Richards
Fix For: 2.0.2.CR1, 2.1.0.BETA1
Attachments: work-tx-rollback.diff
In the org.jboss.seam.util.Work class, the call to userTransaction.commit() is surrounded
by a try/catch(Exception). In the catch block, if an exception occurs during the commit, a
UserTransaction.rollback() is attempted. This may fail as the UserTransaction.commit() may
throw a RollbackException, and in that case the UserTransaction ihas already been
rollbacked. So an attempt to perform a rollback on the UserTransaction result in an
illegalstate exception. This happens to us when something goes wrong in the beforeCommit()
methods and hibernate throws a StaleObjectStateException()
We use seam 1.2.1 + POJO + WebSphere v61.0..13
The code could be something like this (Class Work.java):
try {
T result = work();
if (begin) {
log.debug("committing transaction");
userTransaction.commit();
}
return result;
} catch (Exception e) {
if (begin) {
log.debug("rolling back transaction");
if (userTransaction.getStatus() != STATUS_NO_TRANSACTION) {
userTransaction.rollback();
}
}
throw e;
}
Or the code could explicitely catch the RollbackException
This could be applied at any place in the code when a UserTransaction.commit() is called.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira