如何回滚事务并继续处理更新?

时间:2012-09-03 20:06:06

标签: java-ee transactions ejb

我正试图围绕事务管理,但我很难搞清楚如何从事务回滚中恢复并继续提交新事务。下面的代码是我正在尝试做的简化版本:

@Stateless
public class MyStatelessBean1 implements MyStatelessLocal1 {

@EJB
private MyStatelessLocal1 myBean1;

@TransationAttribute(TransactionAttributeType.NEVER)
public void processObjects(List<Object> objs) {
    // this method just processes the data; no need for a transaction
    for(Object obj : objs) {
        // If the call to process results in the transaction being rolled back,
        // how do I rollback the transaction and continue to iterate over objs?
        this.myBean1.process(obj);
    }
}


@TransationAttribute(TransactionAttributeType.REQUIRES_NEW)
public void process(Object obj) {
    // do some work with obj that must be in the scope of a transaction
}
}

如果在对process(Object obj)的调用中发生事务回滚,则抛出异常,并且objs中的其余对象不会被迭代,并且不会提交任何更新。如果我想回滚发生错误的事务,但继续迭代objs列表,我应该怎么做呢?如果我只是像下面的代码中那样捕获异常,那么我需要做些什么才能确保事务回滚?

public void processObjects(List<Object> objs) {
    // this method just processes the data; no need for a transaction
    for(Object obj : objs) {
        // If the call to process results in the transaction being rolled back,
        // how do I rollback the transaction and continue to iterate over objs?
        try {
            this.myBean1.process(obj);
        } catch(RuntimeException e) {
            // Do I need to do anything here to clean up the transaction before continuing to iterate over the objs?
        }
    }
}

1 个答案:

答案 0 :(得分:3)

对processObjects的调用是在(单独的)Transaction中。 您正在捕获所有RuntimeException,让我们将这些例外分成两组。

第一组: EJBException或使用@ApplicationException(rollback=true)注释的任何其他例外 - &gt; 容器将为您回滚该异常。

第二组: 所有其他例外。 (基本上那些容器不会自动回滚的异常:()。 - &gt;除非你这样做,否则不会回滚事务。

要强制回滚,您可以随时throw new EJBException ...等...

另外,请注意,一旦注释了带有@ApplicationException(rollback=true)的Exception,容器将回滚当前事务(如果有的话)(默认情况下EJB-Beans在事务中),无论您做什么(如果Bean使用@TransactionManagement(TransactionManagementType.CONTAINER)注释,这是EJB中的默认值。