How I change the CMP EntityBean locking strategy (pessimistic or optimistic locking) in EAP6

Solution Verified - Updated -

Issue

  • How to enable the optimistic locking for EJB2 CMP EntityBeans in EAP6.x?
  • What is the appropriate configuration if the "Instance Per Transaction CMP 2.x EntityBean" was used in former EAP versions?
  • CMP EntityBeans are locked in new Transaction
    I am running a EJB2.1 application on EAP 6.1 and have the following scenario:

    • call a statefull sessionbeans method, accessing some cmp-entitybeans (tx-attribute requires-new))
    • in this method call, I access a new instance of this sfb (via InitialContex.lookup/create) and call another method. For some reason, a new transaction is requiered (tx-attribute requires-new)
    • in this second method call, I access the same cmp-entitybeans as in method 1, but the access is locked from the transaction of the previous method

    This scenario worked with JBoss 4.3 (with setting "Instance Per Transaction CMP 2.x EntityBean") , but not in EAP 6
    Here is the log + thread dump :

================ doAll in TX 0:ffffc0a8010a:5a755c78:51f04697:e

23:27:30,376 DEBUG (EJB default - 2) Executing SQL: SELECT t0_p.elementtype, t0_p.element, t0_p.subelementtype, t0_p.subelement, t0_p.datetype, t0_p.validfrom, t0_p.validuntil, t0_p.range, t0_p.status, t0_p.rulekey, t0_p.info FROM ST_ELT t0_p
....
23:27:30,404 TRACE (EJB default - 2) RESET PERSISTENCE CONTEXT: id=daten.StEltPK@6cc4a8f0
...
23:27:30,407 TRACE (EJB default - 2) Trying to acquire lock: org.jboss.as.ejb3.tx.OwnableReentrantLock@43401ab6[State = 0, empty queue][Unlocked] for entity bean org.jboss.as.cmp.component.CmpEntityBeanComponentInstance@2599c538 during invocation: org.jboss.invocation.InterceptorContext@1262f2d1
23:27:30,407 TRACE (EJB default - 2) Acquired lock: org.jboss.as.ejb3.tx.OwnableReentrantLock@43401ab6[State = 1, empty queue][Locked by 0:ffffc0a8010a:5a755c78:51f04697:e] for entity bean instance: org.jboss.as.cmp.component.CmpEntityBeanComponentInstance@2599c538 during invocation: org.jboss.invocation.InterceptorContext@1262f2d1
23:27:30,408 TRACE (EJB default - 2) Registered tx synchronization: org.jboss.as.ejb3.component.entity.interceptors.EntityBeanSynchronizationInterceptor$EntityBeanSynchronization@3026a5f8 for tx: 0:ffffc0a8010a:5a755c78:51f04697:e associated with stateful component instance: org.jboss.as.cmp.component.CmpEntityBeanComponentInstance@2599c538
23:27:30,408 TRACE (EJB default - 2) Trying to acquire lock: org.jboss.as.ejb3.tx.OwnableReentrantLock@43401ab6[State = 1, empty queue][Locked by 0:ffffc0a8010a:5a755c78:51f04697:e] for entity bean org.jboss.as.cmp.component.CmpEntityBeanComponentInstance@2599c538 during invocation: org.jboss.invocation.InterceptorContext@395a557a
23:27:30,408 TRACE (EJB default - 2) Acquired lock: org.jboss.as.ejb3.tx.OwnableReentrantLock@43401ab6[State = 2, empty queue][Locked by 0:ffffc0a8010a:5a755c78:51f04697:e] for entity bean instance: org.jboss.as.cmp.component.CmpEntityBeanComponentInstance@2599c538 during invocation: org.jboss.invocation.InterceptorContext@395a557a
23:27:30,408 DEBUG (EJB default - 2) Looking for stateful component instance with session id: {[-35, 123, -20, -115, -21, -64, 75, -109, -104, -98, 102, 94, -108, -31, 96, -72]}
23:27:30,409 TRACE (EJB default - 2) Trying to acquire lock: org.jboss.as.ejb3.tx.OwnableReentrantLock@10ef63f9[State = 0, empty queue][Unlocked] for stateful component instance:  Instance of BatchLayer {{[-35, 123, -20, -115, -21, -64, 75, -109, -104, -98, 102, 94, -108, -31, 96, -72]}} during invocation: org.jboss.invocation.InterceptorContext@548c791e
23:27:30,409 TRACE (EJB default - 2) Acquired lock: org.jboss.as.ejb3.tx.OwnableReentrantLock@10ef63f9[State = 1, empty queue][Locked by 0:ffffc0a8010a:5a755c78:51f04697:17] for stateful component instance:  Instance of BatchLayer {{[-35, 123, -20, -115, -21, -64, 75, -109, -104, -98, 102, 94, -108, -31, 96, -72]}} during invocation: org.jboss.invocation.InterceptorContext@548c791e
23:27:30,409 TRACE (EJB default - 2) Registered tx synchronization: org.jboss.as.ejb3.component.stateful.StatefulSessionSynchronizationInterceptor$StatefulSessionSynchronization@5263cbef for tx: 0:ffffc0a8010a:5a755c78:51f04697:17 associated with stateful component instance:  Instance of BatchLayer {{[-35, 123, -20, -115, -21, -64, 75, -109, -104, -98, 102, 94, -108, -31, 96, -72]}}


================ next in new TX 0:ffffc0a8010a:5a755c78:51f04697:17

23:27:30,410 DEBUG (EJB default - 2) Executing SQL: SELECT t0_p.elementtype, t0_p.element, t0_p.subelementtype, t0_p.subelement, t0_p.datetype, t0_p.validfrom, t0_p.validuntil, t0_p.range, t0_p.status, t0_p.rulekey, t0_p.info FROM ST_ELT t0_p
...
23:27:30,416 TRACE (EJB default - 2) Trying to acquire lock: org.jboss.as.ejb3.tx.OwnableReentrantLock@43401ab6[State = 1, empty queue][Locked by 0:ffffc0a8010a:5a755c78:51f04697:e] for entity bean org.jboss.as.cmp.component.CmpEntityBeanComponentInstance@2599c538 during invocation: org.jboss.invocation.InterceptorContext@5e196d07


===============  Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.45-b01-451 mixed mode):

"EJB default - 2" prio=5 tid=7f8e12896000 nid=0x11611a000 waiting on condition
   java.lang.Thread.State: WAITING (parking)
          at sun.misc.Unsafe.park(Native Method)
          - parking to wait for  <7face9498> (a org.jboss.as.ejb3.tx.OwnableReentrantLock)
          at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
          at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811)
          at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:842)
          at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1178)
          at org.jboss.as.ejb3.tx.OwnableReentrantLock.lock(OwnableReentrantLock.java:86)
          at org.jboss.as.ejb3.component.entity.interceptors.EntityBeanSynchronizationInterceptor.processInvocation(EntityBeanSynchronizationInterceptor.java:80)
          at org.jboss.as.cmp.component.interceptors.CmpEntityBeanSynchronizationInterceptor.processInvocation(CmpEntityBeanSynchronizationInterceptor.java:67)
          at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
          at org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:21)
          at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
          at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
          at org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor.processInvocation(ComponentDispatcherInterceptor.java:53)
          at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
          at org.jboss.as.ejb3.component.entity.interceptors.EntityBeanAssociatingInterceptor.processInvocation(EntityBeanAssociatingInterceptor.java:79)
          at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
          at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInCallerTx(CMTTxInterceptor.java:226)
          at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:317)
          at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:214)
          at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
          at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41)
          at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
          at org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory$1.processInvocation(ShutDownInterceptorFactory.java:64)
          at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
          at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:59)
          at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
          at org.jboss.as.ejb3.component.interceptors.EjbExceptionTransformingInterceptorFactories$2.processInvocation(EjbExceptionTransformingInterceptorFactories.java:89)
          at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
          at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50)
          at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
          at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:55)
          at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
          at org.jboss.as.ee.component.TCCLInterceptor.processInvocation(TCCLInterceptor.java:45)
          at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
          at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
          at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:165)
          at org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:182)
          at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
          at org.jboss.as.ejb3.component.entity.interceptors.EntityBeanPrimaryKeyInterceptor.processInvocation(EntityBeanPrimaryKeyInterceptor.java:52)
          at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
          at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
          at org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:72)

Environment

  • Red Hat JBoss Enterprise Application Platform (EAP)
    • 6.x

Subscriber exclusive content

A Red Hat subscription provides unlimited access to our knowledgebase, tools, and much more.

Current Customers and Partners

Log in for full access

Log In

New to Red Hat?

Learn more about Red Hat subscriptions

Using a Red Hat product through a public cloud?

How to access this content