В чем разница междуTransaction и withSession в grails?

Я знаю, что получает базовый сеанс, а другой - ссылку на текущий статус транзакции; однако, каковы различия между ними и что будет примером для каждого случая?

Мое требование - пакетное сохранение некоторых записей в блоке метода службы.

Ответ 1

withTransaction немного хакерский, поскольку он позволяет выполнять транзакционную работу в любом месте, но лучше всего отделить свои проблемы и выполнить работу в транзакционной службе. Служба транзакционно по умолчанию, если вы не добавили static transactional = false и можете быть точно настроены на уровне класса и/или метода с помощью аннотации @Transactional. Вы должны просто помещать свой код в сервисный метод без использования withTransaction или withSession.

withSession - это удобный способ доступа к текущему Hibernate Session (обычно тот, который зарегистрирован перехватчиком OpenSessionInView). Если вы хотите очистить сеанс или выполнить другую работу, не отображаемую GORM, это способ получить к ней доступ, не обращаясь к sessionFactory или локальным владельцам потоков, которые использует Spring.

Одним из действительных способов использования withTransaction вне метода транзакционных сервисов является привязка Hibernate Session, когда вы находитесь за пределами запроса контроллера (т.е. при отсутствии автоматического создания Session). withTransaction запустит транзакцию и при необходимости создаст Session и сохранит ее на время закрытия. Поэтому вы можете использовать его, чтобы избежать исключений от ленивой загрузки. Нам нужен еще один способ сделать это без накладных расходов на транзакцию, в тех случаях, когда вы просто читаете из базы данных и не нуждаетесь в транзакционной записи. Но на данный момент этот подход работает. Однако, если вы делаете запись базы данных, переместите код в сервисный метод.

Ответ 2

Session и TransactionStatus - два совершенно разных вещи. Сессия - это абстракция, которая дает вам доступ ко всем функциям спящего режима, в то время как TransactionStatus может использоваться для управления текущей транзакцией.

withSession может использоваться, если вам нужен прямой доступ к функциям спящего режима. Это может быть полезно, если вы хотите использовать функцию спящего режима, которая не поддерживается непосредственно Grails/GORM.