Вы должны задать один вопрос на вопрос:)
Для вопроса №1, да - интеграция Spring / Hibernate гарантирует, что сброс происходит перед фиксацией.Таким образом, вызовы save()
и delete()
будут сбрасываться, и нет необходимости добавлять flush: true
к любому из них.Кроме того, грязные экземпляры, которые вы не вызвали save()
, также будут сброшены, если вы не вызовете discard()
.
Для # 2: Сервисы по умолчанию являются транзакционными, поэтому transactional = true
фактически избыточен - вынужно только указать это, чтобы сказать transactional = false
.Но созданная автоматическая оболочка транзакции выполняется только при отсутствии аннотаций @Transactional
.Если у вас есть одна или несколько аннотаций, они определяют демаркацию транзакции.Таким образом, по умолчанию (т.е. без аннотаций и без свойства transactional
или transactional = true
) все методы являются транзакционными, но если вы аннотируете только подмножество методов, то только транзакционные будут только те.
Как правило, вы быиспользуйте аннотации, когда вам нужно поведение не по умолчанию, т.е. пользовательское распространение, изоляция, тайм-аут и т. д. (или сделать его доступным только для чтения, как в вашем примере).
Вы можете аннотировать на уровне класса, чтобы иметь то же самоеконфигурация для всех методов и, при необходимости, аннотирование отдельных методов для переопределения значений по умолчанию для области видимости.
Для № 3 и № 4 применяются стандартные правила (см. № 2)Если у подкласса есть аннотации, то transactional = true
из этого класса или родительского класса будет игнорироваться, поскольку с помощью аннотаций вы сказали Grails, что вы настраиваете вещи самостоятельно.
Поскольку абстрактные сервисы не могут бытьВ конкретном случае конкретный подкласс, который фактически создан, будет иметь комбинированное поведение базового класса и самого себя.Если все transactional = true
, то это просто, и если у вас есть какие-либо аннотации, они определяют правила.
Вызов методов в суперклассе будет вести себя так же, как вызов методов в текущем классе.Но поведение немного нелогично, если вы не учли последствия применения Spring-прокси.Когда вы вызываете транзакционный метод, прокси перехватывает вызов и присоединяется к активной транзакции, или запускает новую, если необходимо, или запускает новую, если указано REQUIRES_NEW.Но как только вы попадете в реальный класс и вызовете другой метод, вы обойдете прокси.Поэтому, если вы вызовете другой метод с другими настройками аннотации, они будут проигнорированы.Если вы собираетесь это сделать, посмотрите обсуждение этого списка рассылки о том, что происходит и как с ним работать: http://grails.1312388.n4.nabble.com/non-transactional-service-extends-transactional-service-outcome-td3619420.html