0

假设有一个结构如下的 EJB:

@Stateless
public class MyBean {
@PersistenceContext
private EntityManager entityManager;

    public void doSomething() {
        ...
        doAsynchronously();
        ...
        entityManager.persist(someObject);          
        ...
        if (...) {
            throw new RuntimeException();
        }
    }   

    public void doAsynchronously() {
        ...
        entityManager.persist(someOtherObject);
        ...
    }
}

是否正确,当在同步部分引发异常并因此回滚事务时,异步调用不受此影响,并且如果该方法中没有发生错误,实体管理器上的操作应该正确完成?

我发现了很多关于异步 bean 的例子,但在这两种情况下都没有结合使用实体管理器,所以如果有人能引导我找到一个,我会很高兴。


编辑 2013/08/22:

另一个问题 - 代码片段中显示的设置的全部原因是确保代码doAsynchronously()可以完全完成其对实体的操作,无论调用者方法中是否发生异常 - 所以我会得到相同的行为如果我不使用@Asynchronous注释@TransactionAttribute(REQUIRES_NEW)

4

1 回答 1

2

异步方法在另一个线程中执行,因此不会在当前事务的上下文中执行,并且还将使用另一个持久性上下文。

如果目标是开始一项新事务,不受当前事务中可能存在的错误的影响,那么 REQUIRES_NEW 确实是解决方案。但简单地使用 REQUIRES_NEW 不会使调用异步:它将阻塞当前事务,直到新事务完成,然后当前事务将恢复。

于 2013-08-22T07:30:24.953 回答