Несколько вопросов о сервисе Grails - PullRequest
8 голосов
/ 02 декабря 2011

Я работаю с веб-приложением Grails и получаю очень много странных вещей при использовании сервиса Grails. Поэтому я хочу задать несколько вопросов по этому вопросу, чтобы я больше понял об услугах Grails. Это будет очень полезно для меня (и, возможно, для других ^ _ ^). Заранее спасибо.

  1. Если служба настроена со статической транзакцией = true, будут ли она сбрасывать все изменения данных в БД после вызова любого метода с грязным объектом, заблокированным в сеансе Hibernate?

  2. Могу ли я использовать @Transactional аннотацию на уровне класса вместо static transactional = true? И возможно ли поместить @Transactional(readOnly = true) в некоторые методы, которые я просто хочу, чтобы они считывали (запрашивали, находили) данные из БД?

  3. Как насчет наследования транзакций? Я имею в виду, что если родительский сервис настроен static transactional = true, а дочерний сервис имеет собственную аннотацию @Transactional (для класса) и некоторые @Transactional(readOnly = true) (для некоторых методов), что произойдет, если я вызову метод в родительском режиме от ребенка один?

  4. Работает ли транзакция с абстрактным сервисом? Потому что, как я знаю, с помощью абстрактного сервиса мы не можем инициализировать его bean-компонент, и, возможно, при запуске приложения есть некоторые различия в контексте Grails.

1 Ответ

7 голосов
/ 02 декабря 2011

Вы должны задать один вопрос на вопрос:)

Для вопроса №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

...