2012-09-03 34 views
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? 
     } 
    } 
} 

回答

3

对processObjects的调用位于(单独的)事务中。 您正在捕捉所有RuntimeException s,让我们把这些例外分成两组。

集团之一: EJBException或任何其他异常与@ApplicationException(rollback=true)注解 - > 容器将回滚该异常为您服务。

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

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

此外,请注意,一旦引发了一个带有@ApplicationException(rollback=true)注释的异常,容器将回滚当前事务(如果有的话)(EJB- Bean默认处于事务中),无论您做什么并忽略例如)Bean是否注释为@TransactionManagement(TransactionManagementType.CONTAINER),这是默认的EJB。

+0

感谢您的回答!因此,如果任何异常用'@ApplicationException(rollback = t rue)'在调用'this.myBean1.process(obj)'期间被抛出;',事务将被容器回滚并且我可以吞下/记录异常?然后,在下次调用this.myBean1.process(obj)时,容器会创建一个新的事务;当我们遍历objs列表时, –