В приложении 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 ()
, транзакция только для чтения будет быть запущенным. Если выполняется транзакция чтения-записи, она будет участвовать в этой транзакции.