2014-11-26 5 views
1

컨테이너 관리 트랜잭션에서 트랜잭션 처리에 대해 this blog을 읽습니다.컨테이너 관리 트랜잭션에서 EJB 트랜잭션 롤백

저자는 명확하게 EJB 트랜잭션과 데이터베이스 트랜잭션의 차이를 구분합니다. 데이터베이스 트랜잭션은 EJB 트랜잭션 중 하나 일뿐입니다.

이 예제를 고려하십시오

가 돈 거래를 가져 가라. 이는 하나 이상의 데이터베이스에서 일부 숫자를 변경하는 것이 아닙니다. 관리, 통지, 확인 및 유효성 검사도 진행됩니다. , 알림 단계가 실패하면 확인과 관련된 JMS 트랜잭션이 롤백됩니까 :이 예제를 바탕으로

@Stateless 
public class MoneyTransactionBean { 

public void MoneyTransfer(int amount, BankAccount from, BankAccount to){ 

//db transaction 
/// adminstration transaction //JMS 
    // confirmation //JMS 
    // Notification //JSP 
    // validation //EJB 
    // email //JMAIL 
} 

} 

시나리오 1 다음과 같은 비 저장 빈을 고려? 즉, JMS 메시지가 대기열에서 제거 될 것인가, 즉 Notification 이벤트가 JMS 대기열에서 지워지는 것인가?

시나리오 2 : (개별 Bean에서 호출 된) 모든 개별 트랜잭션이 성공했지만 Validation이 실패하면 확인 단계의 JMS 메시지가 롤백되어 전자 메일이 대기열에서 제외됩니까?
이 경우 트랜잭션의 롤백은 어떻게됩니까?

답변

0

JMS 메시지는 EJB 세션에서 사용 된 설정과 상관없이 EJB 내에서 전송되기 때문에 EJB와 동일한 트랜잭션 컨텍스트의 일부입니다.

"모든 개별 거래가 성공하면"라고 말합니다. 이러한 각 단계는 기본적으로 MoneyTransfer와 동일한 트랜잭션의 모든 부분이며 모든 예외 (롤백 = false 인 @ApplicationException 제외)로 인해 롤백됩니다.

전자 메일 단계는 유효성 검사 단계 후에 발생하므로 유효성 검사에서 예외가 발생하면 메일이 보내지지 않습니다.

+0

"확인"JMS 대기 이벤트는 어떻게됩니까? 너는 그것에 대해 말하지 않았다. 나는 더 구체적인 질문을 위해 위의 질문을 편집했다. 감사합니다 –

+0

@brainstorm 귀하의 의사 코드는 다소 혼란 스럽습니다. 확인은 MoneyTransfer에 의해 보내지 는가 아니면 관리 트랜잭션에 의해 생성 된 임시 대상 (reply-to) 대기열입니까? – NBW

+0

그것은 어떻게 중요할까요? 네가 무엇을 요구하는지 나는 명확하지 않다. 확인은 전체 MoneyTransfer 트랜잭션의 또 다른 단계 일뿐입니다. MoneyTransfer의 각 행은 전체 트랜잭션 –