Grails ручные транзакции без классов домена
Я не уверен, что я что-то здесь упускаю, но возможно ли ручное управление транзакциями в Grails (в классах groovy в src/groovy) без использования метода withTransaction?
В моем приложении нет классов домена, так как я вызываю сервисный уровень другого веб-приложения Java.
3 ответа
Методы обслуживания являются транзакционными по умолчанию. Это самый простой способ получить транзакционное поведение в Grails:
class SomethingService {
def doSomething() {
// transactional stuff here
}
}
Если вам нужен более точный контроль, чем этот, вы можете запускать и завершать транзакции программно через Hibernate:
class CustomTransactions {
def sessionFactory
def doSomething() {
def tx
try {
tx = sessionFactory.currentSession.beginTransaction()
// transactional stuff here
} finally {
tx.commit()
}
}
}
Единственный способ начать транзакции в приложении Grails - это те, которые упомянуты в этом ответе.
В моем приложении нет классов домена, так как я вызываю сервисный уровень другого веб-приложения Java.
Это действительно отдельное приложение или просто Java JAR, от которого зависит ваше приложение Grails? Если первое, то транзакции должны управляться приложением, выполняющим постоянство.
Выше метод тоже правильно.
Вы также можете использовать @Transactional(propagation=Propagation.REQUIRES_NEW)
class SomethingService{
def callingMathod(){
/**
* Here the call for doSomething() will
* have its own transaction
* and will be committed as method execution is over
*/
doSomething()
}
@Transactional(propagation=Propagation.REQUIRES_NEW)
def doSomething() {
// transactional stuff here
}
}