2012-02-15 8 views
4

EJB 3.1의 트랜잭션에 대해 이해할 수 있도록 도와주십시오. GlassFish v3을 사용 중이며 다음과 같은 상황이 발생합니다.EJB 3.1 TransactionAttributeType.REQUIRES_NEW 및 setRollbackOnly

@Stateless 
@LocalBean 
public class BeanA { 

    @Inject BeanB bean; /* which has no TransactionAttribute set */ 
    @Resource SessionContext context; 

    public void run() { 
     ... 
     for (...) { 
      process(someValue); 
     } 
    } 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public void process(String someValue) { 

     try { 

      SomeEntity entity = bean.getEntity(someValue); 
      entity.setSomeProperty("anotherValue"); 

      ... 

     } catch(CustomException e) { 
      this.context.setRollbackOnly(); 
     } 
    } 

} 

서블릿에서 BeanA.run이 호출되었습니다. 각 반복을 별도의 트랜잭션으로 취급하고 싶습니다. 나는 TransactionAttributeType.REQUIRES_NEW를 사용하여 이것을 인식 할 수 있다고 생각했지만, setRollbackOnly를 호출 한 후에 beanB의 후속 반복에서 javax.ejb.EJBTransactionRolledbackException을 얻었습니다. 그러나 이상한 것은 모든 것을 옮기고 새로운 BeanC에 run()을 호출하고 대신 beanC.process를 호출하는 것입니다. 내가 뭘 놓치고 있니? 아무도 이것이 왜 그런 식으로 작동하는지에 대해 밝힐 수 있습니까?

편집 : 생각해보십시오 : 컨테이너가 동일한 EJB 내의 메소드 호출을 가로 채지 않기 때문입니까?

편집 2 (합리적으로 보일 것이다) : 그래, 여기에 답을 발견 EJB Transactions in local method-calls

+0

질문에 대한 답변을 제공하고 해결 방법을 표시하여 질문에 올바르게 플래그를 지정할 수 있도록하십시오. 또한 다음 리소스가 유용 할 수 있습니다. http://stackoverflow.com/questions/8079142/transactionattribute-requires-new-in-jpa/8079752#8079752 http://piotrnowicki.com/2011/11/am-i -in-the-same-transaction-am-i-using-same-persistencecontext/http://stackoverflow.com/a/7218283/920607 –

+0

입력 해 주셔서 감사합니다. 나는 내 자신의 질문에 답하기 전에 또 다른 7 시간을 기다려야 할 것이다. –

답변

4

여기에 대한 답을 찾을 수 (그래도 난 그것을 찾기 위해 답을 알고 있었다 :)) : EJB Transactions in local method-calls

에서을 short : 컨테이너가 로컬 메소드 호출을 인터셉트하지 않으므로 setRollbackOnly가 롤백을위한 유일한 트랜잭션으로 표시되어 예외를 설명합니다.