【问题标题】:Grails transaction never completesGrails 事务永远不会完成
【发布时间】:2013-04-05 19:00:15
【问题描述】:

考虑下面的代码,它试图在事务中创建一个新的SerpKeyword 并打印到控制台以显示它的位置。

    if (!serpKeyword) {
        println "I DIDN'T FIND THE KEYWORD!"
        SerpKeyword.withNewTransaction {
            println "SO NOW I'M BEGINNING A TRANSACTION"
            serpKeyword = new SerpKeyword(
                    keyword: searchKeyword,
                    geoKeyword: geoKeyword,
                    concatenation: concatenation,
                    locale: locale
            )
            println "NOW I'LL SAVE THE KEYWORD"
            serpKeyword.save(failOnError: true, flush: true)
            println "AND NOW THE KEYWORD IS SAVED"
        }
    }

我马上看到的控制台输出是:

I DIDN'T FIND THE KEYWORD!
SO NOW I'M BEGINNING A TRANSACTION
NOW I'LL SAVE THE KEYWORD

我从来没有看到我的输出的最后一行,这表明该记录永远不会保存。无论是否使用我传递给save 的选项,我都试过了。无论如何,它只是挂了一段时间,最终我得到了这个堆栈跟踪:

Got error -1 from storage engine. Stacktrace follows:
java.sql.SQLException: Got error -1 from storage engine
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2019)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1937)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1922)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at com.reachlocal.grails.sales.AdvertiserConnectionService$_findOrCreateSerpKeyword_closure9$$EO2A9QHA.doCall(AdvertiserConnectionService.groovy:624)
    at org.grails.datastore.gorm.GormStaticApi.withNewTransaction(GormStaticApi.groovy:696)
    at com.reachlocal.grails.sales.AdvertiserConnectionService$$EO2A9QHA.findOrCreateSerpKeyword(AdvertiserConnectionService.groovy:615)
    at com.reachlocal.grails.sales.AdvertiserConnectionService$$EO2A9QHA.createSerpEntryForKeyword(AdvertiserConnectionService.groovy:659)
    at com.reachlocal.grails.sales.AdvertiserConnectionService$$EO2A9QHA.addKeyword(AdvertiserConnectionService.groovy:51)
    at com.reachlocal.grails.serp.SerpController$_closure9.doCall(SerpController.groovy:77)
    at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195)
    at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
    at org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:65)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:680)

什么给了?

【问题讨论】:

  • 可能您的表已损坏。可以直接插入吗?

标签: mysql grails transactions grails-orm grails-2.0


【解决方案1】:

由于以下几个原因,您可能会收到“存储引擎出现错误 -1”:

  1. 您的数据库磁盘空间不足
  2. 您的 my.cnf 文件中有 innodb_force_recovery 开关
  3. MySQL 表空间 ID 不匹配。

解决此问题的最佳方法是查看MySQL error log

【讨论】:

    【解决方案2】:

    除了域类serpKeyword 中的sequence/auto 之外,您是否将id 生成策略设置为assigned

    如果你也可以在帖子中添加域类,将有助于调试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      相关资源
      最近更新 更多