1

我们在 EJB 3.0 / JPA 1.0 / DB2 10.1 应用程序中遇到表锁定和死锁问题。我们发现,如果在支持事务的 ejb 方法中执行简单的 SELECT 查询,记录会被锁定(下一个键共享锁定 - NS 锁定模式),最终导致潜在的死锁问题。如果在没有事务的情况下在 ejb 方法中执行相同的查询,则不会发生锁定,我认为这是应该的方式。

问题:我们有 ejb ejbA 和需要事务的 methodA。我们有带有 methodB 的 ejbB,它具有简单的选择查询,并且不应在事务中运行,因此我们将 trnasaction 属性设置为:NotSupported。我们从methodA调用methodB。

Oracle EE6 教程说:如果客户端在事务中运行并调用企业 bean 的方法,则容器在调用该方法之前暂停客户端的事务。该方法完成后,容器恢复客户端的事务。

据我们了解,methodB 应该暂停来自 methodA 的事务并且不应该锁定记录,但确实如此,这使我得出结论事务没有暂停。

您能否帮助我们解决和理解该行为。

4

1 回答 1

0

你怎么叫methodB

如果调用代码如下所示:

@Stateless
public class MyEJB{

    @TransactionAttribute(REQUIRED)
    public void methodA (){
       ...
       methodB();
       ...
    }

    @TransactionAttribute(NOT_SUPPORTED)
    public void methodB (){
        ...
    }
}

应用服务器永远不会知道何时暂停事务(方法调用不会调用容器创建的代理的方法)。

要正确调用具有不同事务语义的方法,您需要访问以下可用的增强对象SessionContext

@Stateless
public class MyEJB{

    @Resource
    SessionContext sc;         

    MyEJB self;  

    @PostConstruct
    public void init(){
      this.self = this.sc.getBusinessObject(MyEJB.class);
    }

    @TransactionAttribute(REQUIRED)
    public void methodA (){
       ...
       self.methodB();
       ...
    }

    @TransactionAttribute(NOT_SUPPORTED)
    public void methodB (){
        ...
    }
}
于 2013-08-13T14:57:19.317 回答