2013-08-21 33 views
0

假设具有EJB结构是这样的:异步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年8月22日:

另一个问题 - 如代码片段所示的全部理由的设置是为了确保在doAsynchronously()代码可以完全完成其操作在实体上,无论在主叫方法发生异常 - 所以,如果我不是使用@Asynchronous注释与@TransactionAttribute(REQUIRES_NEW)我会得到相同的行为?

回答

2

一种异步方法在另一线程中执行,并且将因此不在当前事务的上下文中执行,并将使用其他持久上下文以及。

如果目标是启动一个新的事务,由你可能在当前的错误的影响,REQUIRES_NEW确实解决方案。但是简单地使用REQUIRES_NEW不会使调用异步:它会阻止当前事务变为空的,新事务变为错误,然后当前事务将恢复。

+0

感谢您的确认。我知道第二种解决方案是同步的,但正如我所说的,其目的是完成某些实体操作,即使其他人由于异常而回滚,而不是必须异步运行。 –