[jboss-as7-dev] JTA Synchronization.afterCompletion callback can occur in a background thread but JPA EntityManager must be accessed in single-threaded manner...

Scott Marlow smarlow at redhat.com
Fri Feb 22 10:05:23 EST 2013


On 02/22/2013 09:45 AM, Scott Marlow wrote:
> Related jira issues are HHH-7910 + AS7-6586.  HHH-7910 has been around a
> bit longer and contains comments about the current plan to address the
> issue in Hibernate.
>
> As mentioned in HHH-7910, the JTA specification allows
> Sychronization.afterCompletion callbacks to occur in a different thread
> than the application thread that is using the transaction (typically for
> transaction timeout or when a transaction is propagated to a remote thread).
>
> Since the JPA EntityManager is by design, not thread safe, invoking the
> EntityManager.clear() or EntityManager.close() methods from a background
> thread while the application thread may be in the middle of an
> EntityManager invocation is not the best situation (IMO).

On JTA TX rollback, Hibernate will clear the EntityManager (equivalent 
of calling EntityManager.clear) which is a JPA specification requirement.

In the AS JPA container implementation code, transaction scoped entity 
managers are closed at Synchronization.afterCompletion time (also a JPA 
specification requirement).

>
> One improvement that we talked to the JBossTM/TS team about, is adding a
> TM policy that arranges for the Synchronization.afterCompletion to
> always run in the application thread (some of the IRC discussion is
> attached to HHH-7910).  The TM team doesn't think that they could do
> that for both the TX timeout and tx propagating to a remote thread
> (JBossTS) uses.
>
> One alternative solution, might be to create a top level container level
> queue that the background thread Synchronization.afterCompletion defers
> processing to.  As soon as the application thread returns control to the
> top level, the queue is processed in FIFO order.
>
> *Does AS have any other uses of Synchronization.afterCompletion or
> Synchronization.beforeCompletion that expect to run in the application
> thread*?
>
>   From the JPA specification about thread unsafety:
>
> "
> An entity manager must not be shared among multiple concurrently
> executing threads, as the entity manager and persistence context are not
> required to be threadsafe. Entity managers must only be accessed in a
> single-threaded manner.
> "
> _______________________________________________
> jboss-as7-dev mailing list
> jboss-as7-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/jboss-as7-dev
>



More information about the jboss-as7-dev mailing list