Метод setSavePoint транзакции Grails на mysql вызывает исключение - PullRequest
2 голосов
/ 26 июня 2011

Я использую Grails с MySQL 5. Я использую .withTransaction для управления транзакциями в сервисе. В блоке withTransaction я использую метод savePoint (), который вызывает следующее исключение. Примечание: я использую метод setRollbackOnly () без каких-либо проблем.

2011-06-26 23:02:37,818 [quartzScheduler_Worker-7] ERROR listeners.ExceptionPrinterJobListener  - Exception occured in job: GRAILS_JOBS.com.exmp.bdg.PowerRollupJob
org.quartz.JobExecutionException: Transaction manager does not allow nested transactions [See nested exception: org.springframework.transaction.NestedTransactionNotSupportedException: Transaction manager does not allow nested transactions]
    at org.codehaus.groovy.grails.plugins.quartz.GrailsJobFactory$GrailsTaskClassJob.execute(GrailsJobFactory.java:81)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:199)
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:546)
Caused by: org.springframework.transaction.NestedTransactionNotSupportedException: Transaction manager does not allow nested transactions
    at org.springframework.jdbc.datasource.JdbcTransactionObjectSupport.getConnectionHolderForSavepoint(JdbcTransactionObjectSupport.java:151)
    at org.springframework.jdbc.datasource.JdbcTransactionObjectSupport.createSavepoint(JdbcTransactionObjectSupport.java:104)
    at org.springframework.transaction.support.AbstractTransactionStatus.createSavepoint(AbstractTransactionStatus.java:176)
    at org.springframework.transaction.SavepointManager$createSavepoint.call(Unknown Source)
    at com.exmp.bdg.service.PowerRollupService$_doRollup_closure2.doCall(PowerRollupService.groovy:85)

1 Ответ

3 голосов
/ 14 июня 2012

По умолчанию диспетчер транзакций для hibernate и MySQL не имеет точек сохранения.

В BootStrap.groovy добавьте следующее:

transactionManager.setNestedTransactionAllowed(true)

Затем в транзакции вы можете сделать следующее:

Thing.withTransaction { status ->
  //Do some work and a save
  def savePoint = status.createSavepoint()
  //do other work
  if(checkOk)
  {
    //Everything worked so don't need the save point anymore
    status.releaseSavepoint(savePoint)
  }
  else
  {
    //The other work did not work so rollback from it.
    status.rollbackToSavepoint(savePoint)
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...