4

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

@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?
        }
    }
}
4

1 回答 1

3

对 processObjects 的调用在(单独的)事务中。您正在捕获所有RuntimeExceptions,让我们将这些异常分为两组。

第一组: EJBException或任何其他带有注释的异常@ApplicationException(rollback=true)-> 容器将为您回滚该异常。

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

要强制回滚,您总是可以throw new EJBException......等等......

另外,请注意,一旦@ApplicationException(rollback=true)抛出带有注释的异常,容器将回滚当前事务,如果有一个(EJB-Beans 默认在一个事务中),无论你做什么(例如捕获和忽略)如果Bean 带有注释,@TransactionManagement(TransactionManagementType.CONTAINER)在 EJB 中是默认的。

于 2012-09-03T22:03:46.997 回答