次のような構造の 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
annotate withを使用する代わりに@TransactionAttribute(REQUIRES_NEW)
?