2013-02-14 44 views
2

我有一个函数使用了一些在数据库中创建一些信息的EJB Facade。这块数据创建调用应该是原子的,如果一个失败,则不应该提交任何内容。我如何使这块通话事务处理?想要声明使用几个EJB进行事务处理的代码块

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

您可以在这里参考http://docs.oracle.com/javaee/6/api/javax/ejb/TransactionAttributeType.html了解事务属性。 – 2013-02-15 05:39:25

+0

准确地说,函数'myFunction'没有返回类型,所以它不是一个函数。它当然不会加在这个问题上。 – 2013-02-15 21:56:15

回答

3

在EJB3,如果你打算使用声明式事务(容器管理的事务),那么你会标注这些数据与访问调用之一:

@TransactionAttribute(TransactionAttributeType.REQUIRED) 

@TransactionAttribute(TransactionAttributeType.MANDATORY) 

这意味着这些方法将加入目前正在进行的交易如果它在那里。 如果(myFunction)也是一个EJB方法,那么指定REQUIRES_NEW将启动一个新的事务。事务将在发生系统异常时回滚,但不会出现应用程序异常。这就是为什么你需要在这种情况下使用setRollbackOnly。

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

1

在Java EE,EJB是交易工作的技术,默认情况下每个业务方法是事务性的 - 与@TransactionAttribute(REQUIRED)注释除非bean提供者改变它。

在您的情况下,将myFunction方法作为业务方法是非常有益的,因此事务在进入方法时开始并在离开时进行提交/回滚。它将全部由EJB容器为您处理。当引发异常时,容器将自动回滚事务并继而回滚其间的所有操作。