Grails 1.2.0 - принудительный откат службы - PullRequest
2 голосов
/ 10 февраля 2010

У меня есть класс обслуживания, который вызывает другие служебные классы. Сами эти занятия иногда сохранить доменные объекты и очистить их (например: new User(...).save(flush:true)). Я звоню в класс обслуживания из теста.

Является ли мой сервис транзакционным?

Из того, что я вижу в логах, режим промывки всегда меняется:

impl.SessionImpl setting flush mode to: MANUAL
hibernate.SQL select this_.id as i...
type.StringType binding '1rAdPVixha' to parameter
....
impl.SessionImpl setting flush mode to: AUTO

Но мои настоящие вопросы: если мой метод обслуживания является транзакционным при вызове вне службы (например, в тесте), как я могу заставить службу откатить все данные?


РЕДАКТИРОВАТЬ: Я нашел это:

TransactionAspectSupport.currentTransactionInfo().transactionStatus.setRollbackOnly()

Но я все еще хочу знать, является ли мой сервис полностью транзакционным, т.е. даже если я вызову domain.save (flush: true) из служебного класса в моем методе обслуживания , он будет работать в том же TX Context.

Как это:

void testSomething() {
 svc.process(data);
 assert data.exists() ;// true if no rollback happened
}

class MySvc() {
  void process(data) {
    myUtil.process(data);
   }
}

class MyUtil {
  void process(data) { data.save(flush:true)}
}

1 Ответ

3 голосов
/ 11 февраля 2010

Транзакция привязана к потоку, и при условии, что каждый транзакционный метод имеет настройку распространения «по умолчанию» по умолчанию, вторичные вызовы присоединятся к активной транзакции. Инициирующий вызов будет зафиксирован после его завершения, если что-то не вызывает откат (исключение во время выполнения или явный вызов).

Имейте в виду, что флэш отличается от коммита. Транзакционный метод установит в соединении значение autocommit, равное false, поэтому при сбросе данные передаются в базу данных, но они сохраняются во временной очереди транзакций в случае необходимости отката. Вы можете выполнить сброс несколько раз, например, если вы делаете много вставок и хотите уменьшить использование памяти приложения. Когда вы фиксируете базу данных, временные изменения будут постоянными.

...