【问题标题】:Ejb CMT Transaction Attribute NotSupported does not suspend client transactionEjb CMT 事务属性 NotSupported 不暂停客户端事务
【发布时间】:2013-08-15 03:24:51
【问题描述】:

我们在 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 的事务并且不应该锁定记录,但确实如此,这使我得出结论,事务没有暂停。

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

【问题讨论】:

    标签: transactions locking ejb deadlock


    【解决方案1】:

    你怎么称呼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 (){
            ...
        }
    }
    

    【讨论】:

    • 感谢您的回答。我们从 ejbA.methodA 中调用 ejbB.methodB,不同的 ejb,所以这应该不是问题。
    • 好吧,在这种情况下,也许我们需要实际的代码。你能更新你的问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    相关资源
    最近更新 更多