2010-08-31 85 views
3

一个本地EJB试想以下两个EJB3.0无状态会话bean,每实现一个本地接口和它们部署到同一个容器:EJB 3.0事务边界调用从另一个

public class EjbA { 
    @EJB 
    private ejbB; 

    public void methodA() { 
     for (int i=0; i<100; i++) { 
      ejbB.methodB(); 
     } 
    }  
} 

public class EjbB { 
    public void methodB() { 
     ... 
    } 
} 

当是了methodA调用,每次调用methodB都会导致新的事务开始并提交?或者,既然这些都是本地bean,那么有一个事务在methodA被调用时开始并由methodB重用?

干杯!

回答

2

这取决于你的交易属性 - 你可以用@TransactionAttribute注释设置为之一:必需

  • REQUIRES_NEW

    • SUPPORTS
    • 强制性
    • NOT_SUPPORTED
    • 永远不要

    REQUIRED是默认值,并且如果没有到位的事务将启动新的事务,否则容器将使用现有的事务。

    REQUIRES_NEW告诉容器始终启动新的事务。

    其他选项在我的经验中不太常用 - 但它们都在EJB规范中定义。

    例如:

    @Stateless 
    public class EjbA { 
        @EJB 
        private ejbB; 
    
        @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
        public void methodA() { 
         for (int i=0; i<100; i++) { 
          ejbB.methodB(); 
         } 
        }  
    } 
    

    ...将使了methodA()总是在一个新的事务中运行。

  • 1

    它取决于您如何定义每种方法的交易策略。

    如果需要在方法B和A:它会使用相同的事务两个

    如果所需的和需要新的B:将方法B

    创造新的交易