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의 : 선언적 트랜잭션
이- ExtHotelApiService이 RollBackError가 확장 HotelApiService
- 의 RuntimeException
- ExtHotelApiService.transactional = 사실
- HotelApiService.transactional = 확장 설명이 유효하지 않은 경우 이
- 우리는 호텔을 저장 만 다음 설명
- 우리 해야 다시 롤 트랜잭션을 저장해야합니다 (호텔 지속되지 않음) 거짓
모든 코드는 Declarative Transactions guide에 따라 작성되었지만 한 가지 문제가 있습니다. 롤백이 전혀 발생하지 않습니다! :(
트랜잭션이 성공적으로 커밋 호텔은 RollBackError가 발생 후에도 DB로 유지됩니다! 내가 실수를 가지고 얼마나 올바른 방법으로 선언적인 트랜잭션 작업을?
RollBackError는 RuntimeException이며 rollBackError.class를 rollBackFor 매개 변수로 전달한 경우에도 여전히 무시됩니다. 난 그냥 이해할 수 없다 - 나는 예외를 체크했다. 그러나 심지어 체크 예외가 rollbackFor 매개 변수로 문서에 따라 통과하면 롤백을 시작할 수 있지만, 내 경우에는 그렇지 않다. ( – Oleksandr
RuntimeException이면 왜 당신은 당신의 메소드 선언에 그것을 포함 시켰습니까? (이것은 질문에 관련되어 있지만, 그럼에도 불구하고 궁금합니다.) – Fil
grails 문서의 또 다른 포인트 경고 : 의존성 주입은 선언적 트랜잭션이 작동하는 유일한 방법입니다. new BookService()와 같은 new 연산자를 사용하는 경우 트랜잭션 서비스 – Fil