【问题标题】:Does a nested transaction release the lock after method complete?嵌套事务是否在方法完成后释放锁?
【发布时间】:2013-09-13 18:03:09
【问题描述】:

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

【问题讨论】:

  • entityManager 来自哪里?请出示您的persistence.xml。请添加processWithLock的完整源码。
  • 不相关的评论,但是......所有这些注释。所有这些假定的反思都在进行。我刚开始使用 JPA,但是……以这种方式管理数据的性能税似乎应该很高。
  • @Beryllium 感谢您编辑我的帖子,我添加了没有实体的persistance.xml。

标签: java ejb openjpa websphere-7


【解决方案1】:

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

在事务提交或回滚(即A.onMessage() 返回的时间)之前,所有数据库锁都会保持。所以 processWithLock 在全局事务中调用时不会在执行后释放锁。

【讨论】:

  • 谢谢你的回答,如果我想让processWithLock释放锁,我应该放REQUIRES_NEW注释吗?
  • REQUIRES_NEW 将在新的单独事务中执行带注释的方法。所以是的,当方法返回时,锁将被释放。但是您的 MDB 和 EJB 的事务然后彼此独立(一个可能失败并回滚,另一个成功,反之亦然)。也许在你的情况下没关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多