[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 09:45:34 EST 2013

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).

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 

 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.

More information about the jboss-as7-dev mailing list