2

我有一个函数使用几个 EJB 外观,在数据库中创建一些信息。这块数据创建调用应该是原子的,如果失败,则不应提交任何内容。如何使这个调用块具有事务性?

public myFunction() {
    ...
    ...
    userFacade.create(user);
    addressFacade.create(address);
    orderFacade.create(order);
    ...
}
4

2 回答 2

3

在 EJB3 中,如果您要使用声明性事务(容器管理事务),那么您可以使用以下任一方式注释这些数据访问调用:

@TransactionAttribute(TransactionAttributeType.REQUIRED)

@TransactionAttribute(TransactionAttributeType.MANDATORY)

这意味着如果存在,这些方法将加入当前正在进行的事务。如果 (myFunction) 也是一个 EJB 方法,那么指定REQUIRES_NEW将启动一个新事务。当系统异常发生而不是应用程序异常时,事务将回滚。这就是在这种情况下需要使用 setRollbackOnly 的原因。

更多细节在这里:http ://docs.oracle.com/javaee/6/tutorial/doc/bncij.html

于 2013-02-15T06:00:02.017 回答
1

在 Java EE 中,EJB 是处理事务的技术,默认情况下,每个业务方法都是事务性的 - 使用@TransactionAttribute(REQUIRED)注释,除非 bean 提供者更改它。

因此,在您的情况下,将myFunction方法设置为业务方法将非常有益,因此事务在进入该方法时开始,并在离开该方法时提交/回滚。这一切都将由 EJB 容器为您处理。当抛出异常时,容器将自动回滚事务,进而回滚其间的所有操作。

于 2013-02-15T22:04:57.327 回答