代码之家  ›  专栏  ›  技术社区  ›  joelittlejohn

EJB3.0事务边界从另一个本地EJB调用一个本地EJB

  •  3
  • joelittlejohn  · 技术社区  · 14 年前

    假设以下两个EJB3.0无状态会话bean,每个bean实现一个本地接口,并部署到同一个容器中:

    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 回复  |  直到 14 年前
        1
  •  2
  •   richj    14 年前

    它取决于您的transaction属性-您可以使用@transaction attribute注释将其设置为:

    • 必修的
    • 呼唤新
    • 支架
    • 强制性的
    • 诺特支持
    • 从未

    “必需”是默认值,如果没有事务就位,则将启动新事务,否则容器将使用现有事务。

    要求“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()始终在新事务中运行。

        2
  •  1
  •   mhshams    14 年前

    这取决于您如何为每个方法定义事务策略。

    如果方法B和A中需要它:它将对这两个方法使用相同的事务

    如果它对a是必需的,对b是必需的:它将为方法b创建新事务