Seam transaction management fails after transaction timeout
------------------------------------------------------------
Key: JBSEAM-4611
URL:
https://jira.jboss.org/jira/browse/JBSEAM-4611
Project: Seam
Issue Type: Bug
Components: Core
Affects Versions: 2.1.2.GA
Environment: WebSphere 6.1.0.17 (no EJB3 feature pack), BMT
Reporter: Tobias Otto
After a transaction timeout happened on a timer thread, that thread is rendered useless
regarding transaction management. The next time Seam tries to start a transaction another
IllegalStateException ("transaction not active") is thrown.
I would like to suggest the following change to EntityTransaction.java (in
org.jboss.seam.transaction:
public int getStatus() throws SystemException
{
// $TO 20100318 Patch: getRollbackOnly() throws IllegalStateException, if
getActive() = false !
if ( isEntityManagerSet() && getDelegate(). isActive() &&
getDelegate().getRollbackOnly() )
{
return Status.STATUS_MARKED_ROLLBACK;
}
else if ( isEntityManagerSet() && getDelegate().isActive() )
{
return Status.STATUS_ACTIVE;
}
else
{
return Status.STATUS_NO_TRANSACTION;
}
}
What did I change?
In the line: if ( isEntityManagerSet() && getDelegate(). isActive() &&
getDelegate().getRollbackOnly() )
I inserted getDelegate(). isActive() BEFORE getDelegate(). getRollbackOnly() becuase
getRollbackOnly() throws an IllegalStateException ("transaction not active") if
the transaction isn't "active". I believe the method getStatus() should
return "STATUS_NO_TRANSACTION" if thats what the delegate says (it does, when
the transaction is "not active")! It shouldn't throw the
IllegalStateException.
I have come across that problem, when running a Seam 2.1.2 application inside a IBM
WebSphere 6.1.0.17 container (no EJB3 feature pack) letting seam handle the transactions
(-> so Bean-Managed-Transaction (BMT) from the viewpoint of the container). The problem
first occurs when a transaction of a timer or web services interface goes into timeout
(transaction timeout). After that timeout the one thread that the transaction timeout
occured in, can't use seam managed transactions any more. And that's because
inside the woven-in code for transaction management "getStatus()" is called. And
that leads to an IllegalStateException ("transaction not active") when any
transactional method of that timer thread is called. It might be that I am doing something
wrong initializing the seam lifecycle on the timer thread (it's obviously not a http
thread that is handled by seam by default!). And I am observing, that the problem is bound
to the thread the transaction timeout occured in.
So there might be something else wrong, because transaction handling works fine, until the
first transaction timeout occurs on a timer thread (no problem on a gui / web thread !)
But please comment on my suggestion to change EntityTransaction.java from seam version
2.1.2.
I belive the contract for getStatus() should be to not throw an IllegalStateException when
a transaction is "not active" but to return "STATUS_NO_TRANSACTION" in
that case.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira