0

我使用 WebSphere 7 和 OpenJPA。

这是两个bean和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)
        ...
        }
    }

processWithLock执行后是否释放锁?

4

1 回答 1

1

您的 MDB 定义了事务边界,EJB B只参与由A启动的事务。嵌套事务是不同的。

所有数据库锁都被持有,直到事务提交或回滚,即A .onMessage() 返回时。因此processWithLock在执行后不会释放锁,当在全局事务中调用时。

于 2013-09-13T21:29:00.513 回答