Граальс: декларативные операции - PullRequest
0 голосов
/ 28 июля 2010
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 */
}
}

Обратите внимание на несколько вещей:

  1. ExtHotelApiService расширяет HotelApiService
  2. RollBackError расширяет RuntimeException
  3. ExtHotelApiService.transactional = true
  4. HotelApiService.transactional = false
  5. Мы должны сохранить отель и только после этого сохранить описание
  6. Мы должны откатить транзакцию (и не сохранять гостиницу), если описание недействительно (не может быть сохранено)

Весь код был написан согласно Руководство по декларативным операциям но есть одна проблема - откат вообще не происходит!: (

Транзакция успешно фиксируется, и гостиница сохраняется в БД даже после выброса RollBackError!

Где я допустил ошибку и как правильно работать с декларативными транзакциями?

1 Ответ

1 голос
/ 28 июля 2010

Поведение по умолчанию для декларативного управления транзакциями в Spring сообщает менеджеру транзакций откат для любого непроверенного исключения и игнорирование любых проверенных исключений.Проверенные исключения могут быть объявлены для запуска отката, но если настройки @Transactional по умолчанию остаются без изменений, проверенное исключение не окажет влияния на текущую транзакцию.

Документация Spring по этому вопросу доступна здесь , а соответствующие разделы - 10.5.5 и 10.5.6.Обратите особое внимание на следующее:

Любое исключение RuntimeException запускает откат, а любое проверенное исключение - нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...