MySQL上的Grails事务setSavePoint方法导致异常 [英] Grails transaction setSavePoint method on mysql causes exception

查看:177
本文介绍了MySQL上的Grails事务setSavePoint方法导致异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用grails和mysql 5.我正在使用.withTransaction进行服务中的事务管理。在withTransaction块中,我使用了导致以下异常的savePoint()方法。

  2011-06-26 23:02:37,818 [quartzScheduler_Worker- 7] ERROR listeners.ExceptionPrinterJobListener  - 在作业中发生异常:GRAILS_JOBS.com.exmp.bdg.PowerRollupJob 
org.quartz.JobExecutionException:事务管理器不允许嵌套事务[请参阅嵌套异常:org.springframework.transaction.NestedTransactionNotSupportedException :事务管理器不允许嵌套事务]
在org.quartz.core.JobRunShell中org.codehaus.groovy.grails.plugins.quartz.GrailsJobFactory $ GrailsTaskClassJob.execute(GrailsJobFactory.java:81)
.run(JobRunShell.java:199)
at org.quartz.simpl.SimpleThreadPool $ WorkerThread.run(SimpleThreadPool.java:546)
导致:org.springframework.transaction.NestedTransactionNotSupportedException:事务管理器不允许在org.springframework.jdbc.datasource.JdbcTransactionObjectSupport.get中嵌套事务
ConnectionHolderForSavepoint(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)


解决方案

默认情况下,hibernate和MySQL的事务管理器已启用保存点。



在BootStrap.groovy中添加以下内容:
$ b

transactionManager.setNestedTransactionAllowed(true)



然后在交易中您可以执行以下操作:

  Thing.withTransaction {status  - > 
//做一些工作并保存
def savePoint = status.createSavepoint()
//做其他工作
if(checkOk)
{
//所有工作都不需要保存点了
status.releaseSavepoint(savePoint)
}
else
{
//其他工作无效所以从它回滚。
status.rollbackToSavepoint(savePoint)
}

}


I am using grails with mysql 5. I am using .withTransaction for transaction management in a service. Within the withTransaction block I am using savePoint() method which is causing the following exception. Note: I am using setRollbackOnly() method without any issue.

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.

In BootStrap.groovy add the following:

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

}

这篇关于MySQL上的Grails事务setSavePoint方法导致异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆