嵌套事务是否在方法完成后释放锁定?

时间:2013-09-13 18:03:10

标签: java ejb openjpa websphere-7

我使用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 在执行后释放锁吗?

1 个答案:

答案 0 :(得分:1)

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

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