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

标签 jakarta-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 list ,我该怎么做呢?如果我只是像下面的代码一样捕获异常,我需要做些什么来确保事务回滚?
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?
        }
    }
}

最佳答案

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

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

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

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

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

关于jakarta-ee - 如何回滚事务并继续处理更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12253448/

相关文章:

java - EJB3 业务逻辑模式与实践

java - 在 2 节点 wildfly 集群中调用远程 ejb

jsf - 上传的图片仅在刷新页面后可用

java - 事务之间的竞争条件

java - EJB限制: compromise component distributability

multithreading - (Tomcat) 网络服务 : OutOfMemoryError: unable to create new native thread

java - Apache Kafka 是否能够处理事务?

sql - 取消查询后交易仍处于打开状态

java - 在基于 EJB 的应用程序中加载 spring 上下文

java - EJB 如何并行化一个长时间的 CPU 密集型进程?