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 */
}
}
Обратите внимание на несколько вещей:
- ExtHotelApiService расширяет HotelApiService
- RollBackError расширяет RuntimeException
- ExtHotelApiService.transactional = true
- HotelApiService.transactional = false
- Мы должны сохранить отель и только после этого сохранить описание
- Мы должны откатить транзакцию (и не сохранять гостиницу), если описание недействительно (не может быть сохранено)
Весь код был написан согласно Руководство по декларативным операциям но есть одна проблема - откат вообще не происходит!: (
Транзакция успешно фиксируется, и гостиница сохраняется в БД даже после выброса RollBackError!
Где я допустил ошибку и как правильно работать с декларативными транзакциями?