문제

I work with WebSphere 7 and OpenJPA.

Here is two beans and part of persistance.xml:

<persistence-unit name="ASAP_Main">
    <jta-data-source>jdbc/ASAPDB</jta-data-source>
    <properties>
            <property name="openjpa.Optimistic" value="false"/>
            <property name="openjpa.ReadLockLevel" value="none"/>
            <property name="openjpa.WriteLockLevel" value="none"/>
            <property name="openjpa.LockManager" value="pessimistic(VersionCheckOnReadLock=false,VersionUpdateOnWriteLock=false)"/>
            <property name="openjpa.LockTimeout" value="20000"/>
    </properties>
</persistence-unit>
    @PersistenceContext(unitName = "ASAP_Main")
    private EntityManager em;

    @MessageDriven
    public class A implements MessageListener {
        @EJB
        private B b;

        @TransactionAttribute(TransactionAttributeType.REQUIRED)
        public void onMessage(Message message) {
            b.processWithLock(message.getObject());
        ...
        }
     }

    @Stateless
    public class B{
        @TransactionAttribute(TransactionAttributeType.REQUIRED)
        public void processWithLock(Object obj){
        em.lock(obj)
        ...
        }
    }

Does processWithLock release lock after execution?

도움이 되었습니까?

해결책

Your MDB defines the transaction border, the EJB B just takes part in the transaction started by A. A nested transation is something different.

All database locks are held until the transaction commits or rolls back, which is when A.onMessage() returns. So processWithLock will not release the lock after execution, when called within a global transaction.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top