简体   繁体   English

mysql上的Grails事务setSavePoint方法导致异常

[英]Grails transaction setSavePoint method on mysql causes exception

I am using grails with mysql 5. I am using .withTransaction for transaction management in a service. 我在MySQL 5中使用grails。在服务中使用.withTransaction进行事务管理。 Within the withTransaction block I am using savePoint() method which is causing the following exception. 在withTransaction块中,我正在使用savePoint()方法,这将导致以下异常。 Note: I am using setRollbackOnly() method without any issue. 注意:我正在使用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)

By default the transaction manager for hibernate and MySQL don't have the save points enabled. 默认情况下,休眠和MySQL的事务管理器未启用保存点。

In BootStrap.groovy add the following: 在BootStrap.groovy中添加以下内容:

transactionManager.setNestedTransactionAllowed(true)

Then in a transaction you can do the following: 然后,在事务中,您可以执行以下操作:

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)
  }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM