2015-02-07 4 views
0

Impl 클래스에서 RuntimeException을 throw하면 트랜잭션이 롤백되지 않습니다. 하지만 Impl 클래스에서 update 문을 주석 처리하고 route에서 update 문 코드에 주석을 달면 트랜잭션이 롤백됩니다.낙타 경로에서 트랜잭션을 롤백하는 방법

구현 클래스가 예외를 throw 할 때 라우트에 작성된 업데이트 문을 롤백하는 방법.

<camelContext xmlns="http://camel.apache.org/schema/spring"> 
<route id="wsRoute">  
<from uri="cxf:bean:paymentServiceEndpoint"/> 

<transacted /> 
<split streaming="true" parallelProcessing="true"> 
    <simple>${in.body[0]}</simple> 
    <setHeader headerName="bank"> 
     <simple>${body.bank}</simple> 
    </setHeader> 
    <log message="The header value is ${header.bank}" /> 

    <setBody> 
     <constant> 
       UPDATE TEST 
       SET RECEIVED_BY = 'Y' 
        WHERE ID = :?bank 
     </constant> 
     </setBody> 
     <to uri="jdbc:dataSource?useHeadersAsParameters=true" /> 

</split> 
<bean ref="paymentServiceImpl" /> 
    <log message="response = ${body}"/> 
</route> 
</camelContext> 

@Transactional(value="txManager", propagation=Propagation.REQUIRED, rollbackFor=Exception.class) 
public TransferResponse transfer(TransferRequest request) { 
    System.out.println("***********PaymentServiceImpl..." + request.getFrom()); 
    /* 
    final int updated= jdbc.update("update TEST set RECEIVED_BY = 'Y' where ID = ?", 
      "abc"); 
    */ 
    TransferResponse response = new TransferResponse(); 

    if(true) 
    throw new RuntimeException("update exception"); 

    response.setReply("OK"); 
    System.out.println("***********PaymentServiceImpl.." + response.getReply()); 
    return response; 
} 

답변

1

당신은 트랜잭션에 대한 작업의 단위로, 트랜잭션과 병렬 처리를 사용할 수 없습니다 제대로이 문제를 조율하기 위해 트랜잭션 관리자에 의해 요구되는 동일한 스레드에 의해 수행되어야합니다. 그래서 꺼 버려.

+0

병렬 처리 속성을 제거한 경우에도 트랜잭션이 롤백되지 않습니다. – user739115

관련 문제