我有一个函数使用几个 EJB 外观,在数据库中创建一些信息。这块数据创建调用应该是原子的,如果失败,则不应提交任何内容。如何使这个调用块具有事务性?
public myFunction() {
...
...
userFacade.create(user);
addressFacade.create(address);
orderFacade.create(order);
...
}
我有一个函数使用几个 EJB 外观,在数据库中创建一些信息。这块数据创建调用应该是原子的,如果失败,则不应提交任何内容。如何使这个调用块具有事务性?
public myFunction() {
...
...
userFacade.create(user);
addressFacade.create(address);
orderFacade.create(order);
...
}
在 EJB3 中,如果您要使用声明性事务(容器管理事务),那么您可以使用以下任一方式注释这些数据访问调用:
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@TransactionAttribute(TransactionAttributeType.MANDATORY)
这意味着如果存在,这些方法将加入当前正在进行的事务。如果 (myFunction) 也是一个 EJB 方法,那么指定REQUIRES_NEW
将启动一个新事务。当系统异常发生而不是应用程序异常时,事务将回滚。这就是在这种情况下需要使用 setRollbackOnly 的原因。
更多细节在这里:http ://docs.oracle.com/javaee/6/tutorial/doc/bncij.html
在 Java EE 中,EJB 是处理事务的技术,默认情况下,每个业务方法都是事务性的 - 使用@TransactionAttribute(REQUIRED)注释,除非 bean 提供者更改它。
因此,在您的情况下,将myFunction
方法设置为业务方法将非常有益,因此事务在进入该方法时开始,并在离开该方法时提交/回滚。这一切都将由 EJB 容器为您处理。当抛出异常时,容器将自动回滚事务,进而回滚其间的所有操作。