Транзакционное поведение службы Grails

В приложении Grails поведение методов службы по умолчанию таково, что они являются транзакционными, и транзакция автоматически откатывается, если возникает непроверенное исключение. Однако в Groovy не требуется обрабатывать (или повторно генерировать) проверенные исключения, поэтому существует риск того, что, если метод службы выдает проверенное исключение, транзакция не будет откатана. В связи с этим, кажется целесообразным аннотировать каждый класс обслуживания Grails

@Transactional(rollbackFor = Throwable.class) 
class MyService {

    void writeSomething() {
    }
}

. Предположим, у меня есть другие методы в MyService , один из которых только читает БД, а другой не касается БД. следующие аннотации верны?

@Transactional(readOnly = true)
void readSomething() {}

// Maybe this should be propagation = Propagation.NOT_SUPPORTED instead?
@Transactional(propagation = Propagation.SUPPORTS)
void dontReadOrWrite() {}

Чтобы ответить на этот вопрос, я полагаю, вам нужно знать мои намерения:

  • Если из любого метода генерируется исключение и транзакция выполняется, оно будет свернуто назад. Например, если writeSomething () вызывает dontReadOrWrite () , и последнее выбрасывает исключение, транзакция, запущенная первым, будет отменена. Я предполагаю, что атрибут уровня класса rollbackFor наследуется отдельными методами, если они явно не переопределяют его.
  • Если транзакция не выполняется, она не будет запущена для таких методов, как dontReadOrWrite
  • Если транзакция не выполняется при вызове readSomething () , транзакция только для чтения будет быть запущенным. Если выполняется транзакция чтения-записи, она будет участвовать в этой транзакции.
6
задан Dónal 23 January 2012 в 11:10
поделиться