[jboss-dev-forums] [Design of JBoss Transaction Services] - Transaction Status.STATUS_ROLLEDBACK
huuskart
do-not-reply at jboss.com
Thu Jul 10 07:41:51 EDT 2008
When a transaction timeout or some other unexpected situation occurs, the new JBoss transaction manager (in JBoss 4.2.1.GA) marks the transaction into state Status.STATUS_ROLLEDBACK.
I would argue, from the point of view of bean managed transactions EJB session application code, that this is not quite productive. (note that this is almost the same as JBAS-4481, but this issue concerns application code that wants to clean up a transaction, so that it may try to begin again.)
Trying to code a BMT EJB session, that is able to recover from transaction errors, and reading javax.transaction.Status javadocs, I would never expect to see Status.STATUS_ROLLEDBACK. The only status codes my application code would expect (in case of single resource only) are STATUS_ACTIVE, STATUS_NO_TRANSACTION and STATUS_MARKED_ROLLBACK. Even JTA javadocs suggest this, saying that in stead of STATUS_ROLLEDBACK, NO_TRANSACTION should be returned.
JBoss TM further complicates this issue, because trying to call rollback() on transaction marked STATUS_ROLLEDBACK just throws an IllegalStateException. Thus there is no way an application code can "gracefully" handle the error situation.
Previously my tx handling code looked more or less like this:
| UserTransaction tx = sessionContext.getUserTransaction();
| try {
| tx.begin();
| work();
| tx.commit();
| } finally {
| if ((tx.getStatus() == STATUS_ACTIVE) || (tx.getStatus() == STATUS_MARKED_ROLLBACK))
| tx.rollback();
| }
|
Now this needs to change to:
| UserTransaction tx = sessionContext.getUserTransaction();
| try {
| tx.begin();
| work();
| tx.commit();
| } finally {
| if ((tx.getStatus() == STATUS_ACTIVE) || (tx.getStatus() == STATUS_MARKED_ROLLBACK))
| tx.rollback();
| else if (tx.getStatus() == STATUS_ROLLEDBACK) {
| try {
| tx.rollback();
| } catch (IllegalStateException ex) {
| /* ignore */
| }
| }
| }
|
That is the only way to get the tx back to state NO_TRANSACTION, so that I can call begin() on the transaction again.
Reading JBAS-4481, I get the impression that it is for some reason almost impossible for current implementation to mark the transaction into status NO_TRANSACTION in case of timeout. Fair enough (not really), but could the implementation at least refrain from throwing the IllegalStateException if I rollback a transaction marked STATUS_ROLLEDBACK.
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4163560#4163560
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4163560
More information about the jboss-dev-forums
mailing list