2011-06-26 9 views
2

私はmysql 5でgrailsを使用しています。私はサービス内のトランザクション管理のために.withTransactionを使用しています。 withTransactionブロック内で、次の例外の原因となっているsavePoint()メソッドを使用しています。注意:setRollbackOnly()メソッドを何も問題なく使用しています。GrailsのmysqlのトランザクションsetSavePointメソッドは例外を発生させます

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

MySQLがセーブポイントをサポートしていません。しかし、Postresqlを使えばそれができます。 – ionelmc

答えて

3

デフォルトでは、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) 
    } 

} 
+0

これはなぜですか? –

+0

デフォルト以外の動作です。 –

+0

いいえ、いいえ、私はこのデフォルトを選択した理由はありますか?ネストされたトランザクションを有効にする際にいくつかの危険がありますか? –

関連する問題