我正试图围绕事务管理进行讨论,但我很难弄清楚如何从事务回滚中恢复并继续提交新事务。下面的代码是什么,我试图做一个简化版本:如何回滚事务并继续处理更新?
@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?
}
}
}
感谢您的回答!因此,如果任何异常用'@ApplicationException(rollback = t rue)'在调用'this.myBean1.process(obj)'期间被抛出;',事务将被容器回滚并且我可以吞下/记录异常?然后,在下次调用this.myBean1.process(obj)时,容器会创建一个新的事务;当我们遍历objs列表时, –