2010-07-28 4 views
0
class ExtHotelApiService extends HotelApiService { 

    static scope = "singleton" 
    static transactional = true 

def save(params) { 
    params.hotels.each{ht-> 
    try{ 
    transactionalSave(ht) 
    } catch(Exception e) { 
    /* exceptions handling */ 
    } 
} 
} 

@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW, rollBackFor=RollBackError.class) 
    def transactionalSave(ht) throws RollBackError { 
/* saving hotel and hotel description */ 
} 
} 

주 몇 가지 :Grails의 : 선언적 트랜잭션

  1. ExtHotelApiService이 RollBackError가 확장 HotelApiService
  2. 의 RuntimeException
  3. ExtHotelApiService.transactional = 사실
  4. HotelApiService.transactional = 확장 설명이 유효하지 않은 경우
  5. 우리는 호텔을 저장 만 다음 설명
  6. 우리 해야 다시 롤 트랜잭션을 저장해야합니다 (호텔 지속되지 않음) 거짓
을 (지속 할 수 없음)

모든 코드는 Declarative Transactions guide에 따라 작성되었지만 한 가지 문제가 있습니다. 롤백이 전혀 발생하지 않습니다! :(

트랜잭션이 성공적으로 커밋 호텔은 RollBackError가 발생 후에도 DB로 유지됩니다! 내가 실수를 가지고 얼마나 올바른 방법으로 선언적인 트랜잭션 작업을?

답변

1

봄의의 기본 동작

선언적 트랜잭션 관리는 체크되지 않은 예외를 롤백하고 체크 된 예외를 무시하도록 트랜잭션 관리자에 지시합니다. 체크 된 예외는 롤백을 트리거하도록 선언 될 수 있지만 기본 @Transactional 설정이 그대로 유지되면 체크 된 예외는 현재 거래에 미치는 영향

이것에 대한 Spring 문서는 here이고, 관련 섹션은 10.5.5와 10.5.6이다.

모든 RuntimeException을가 롤백을 트리거하고는 예외 하지 않는 확인 : 특히 다음에 유의.

+0

RollBackError는 RuntimeException이며 rollBackError.class를 rollBackFor 매개 변수로 전달한 경우에도 여전히 무시됩니다. 난 그냥 이해할 수 없다 - 나는 예외를 체크했다. 그러나 심지어 체크 예외가 rollbackFor 매개 변수로 문서에 따라 통과하면 롤백을 시작할 수 있지만, 내 경우에는 그렇지 않다. ( – Oleksandr

+0

RuntimeException이면 왜 당신은 당신의 메소드 선언에 그것을 포함 시켰습니까? (이것은 질문에 관련되어 있지만, 그럼에도 불구하고 궁금합니다.) – Fil

+0

grails 문서의 또 다른 포인트 경고 : 의존성 주입은 선언적 트랜잭션이 작동하는 유일한 방법입니다. new BookService()와 같은 new 연산자를 사용하는 경우 트랜잭션 서비스 – Fil