Транзакция Grails никогда не завершается

Рассмотрим приведенный ниже код, который пытается создать новый 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)

Что дает?


person Samo    schedule 05.04.2013    source источник
comment
Возможно, ваша таблица повреждена. Можете ли вы выполнить прямую вставку?   -  person    schedule 05.04.2013


Ответы (2)


Вы можете получить сообщение «Ошибка -1 от механизма хранения» по нескольким причинам:

  1. В вашей базе данных закончилось место на диске
  2. У вас есть переключатель innodb_force_recovery в вашем файле my.cnf
  3. Несоответствующие идентификаторы табличных пространств MySQL.

Лучший способ устранить эту проблему — взглянуть на MySQL журнал ошибок

person Dror Bereznitsky    schedule 05.04.2013

У вас есть стратегия генерации идентификатора, установленная как assigned какая-либо вещь, отличная от sequence/auto в классе домена serpKeyword?

Будет полезно для отладки, если вы также можете добавить класс домена в сообщение.

person dmahapatro    schedule 06.04.2013