Ручные транзакции Grails без классов предметной области

Я не уверен, что я что-то упустил, но возможно ли вручную управлять транзакциями в Grails (в классах groovy в src/groovy) без использования метода withTransaction?

У меня нет классов предметной области в моем приложении, поскольку я обращаюсь к сервисному уровню другого веб-приложения Java.


person dre    schedule 23.09.2013    source источник


Ответы (3)


Методы службы по умолчанию являются транзакционными. Это самый простой способ получить транзакционное поведение в Grails:

class SomethingService {
    def doSomething() {
        // transactional stuff here
    }
}

Если вам нужен более тонкий контроль, чем этот, вы можете запускать и завершать транзакции программно через спящий режим:

class CustomTransactions {
    def sessionFactory

    def doSomething() {
        def tx
        try {
            tx = sessionFactory.currentSession.beginTransaction()
            // transactional stuff here
        } finally {
            tx.commit()
        }
    }
}
person ataylor    schedule 23.09.2013
comment
Вы также можете использовать аннотации Spring @Transactional для сервисных методов. - person Dónal; 23.09.2013
comment
Если в приложении нет классов домена, не было бы причин устанавливать плагин гибернации, поэтому вышеизложенное было бы даже невозможно. - person Dónal; 24.09.2013

Единственный способ начать транзакции в приложении Grails — это упомянутые в этом ответе.

У меня нет классов предметной области в моем приложении, поскольку я обращаюсь к сервисному уровню другого веб-приложения Java.

Это действительно отдельное приложение или просто Java JAR, от которого зависит ваше приложение Grails? Если первое, то транзакциями должно управлять приложение, выполняющее сохранение.

person Dónal    schedule 23.09.2013

Способ выше тоже правильный.

Вы также можете использовать @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

  }

}

person user3852355    schedule 18.07.2014