假设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)
,我会得到相同的行为吗?
答案 0 :(得分:2)
异步方法在另一个线程中执行,因此不会在当前事务的上下文中执行,并且还将使用另一个持久化上下文。
如果目标是启动一个新事务,不受当前错误的影响,REQUIRES_NEW确实是解决方案。但是简单地使用REQUIRES_NEW将不会使调用异步:它将阻止当前事务的新事件,并且当前事务将恢复。