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
질문에 대한 답변을 제공하고 해결 방법을 표시하여 질문에 올바르게 플래그를 지정할 수 있도록하십시오. 또한 다음 리소스가 유용 할 수 있습니다. 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 –
입력 해 주셔서 감사합니다. 나는 내 자신의 질문에 답하기 전에 또 다른 7 시간을 기다려야 할 것이다. –