2013-08-21 3 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()의 코드가 완전히 작업을 완료 할 수 있는지 확인하는 것이 었습니다 엔티티에서 호출자 메서드에서 예외가 발생하는지 상관없이 -을 주석으로 처리하는 대신 동일한 동작을 얻으실 수 있습니까?

답변

2

비동기 메서드는 다른 스레드에서 실행되므로 현재 트랜잭션의 컨텍스트에서 실행되지 않으며 다른 지속성 컨텍스트도 사용합니다.

목표가 현재 트랜잭션에서 발생하는 오류의 영향을받지 않은 새 트랜잭션을 시작하는 것이라면 REQUIRES_NEW가 실제로 해결책입니다. REQUIRES_NEW를 사용하면 호출을 비동기로 만들지 않습니다. 새 트랜잭션이 완료 될 때까지 현재 트랜잭션을 차단하므로 현재 트랜잭션이 재개됩니다.

+0

확인해 주셔서 감사합니다. 두 번째 해결책은 동기식이라고 알고 있지만, 말했듯이 다른 엔티티가 예외로 인해 롤백 되더라도 비동기 적으로 실행되는 것이 아니라 특정 엔티티 작업을 완료하는 것이 목적입니다. –