【问题标题】:innodb rollback on timeoutinnodb 超时回滚
【发布时间】:2013-05-23 14:28:36
【问题描述】:

我有一个运行存储过程的 mysql 5.1 db

 
       START TRANSACTION
       Insert some rows to table 1
       Insert some rows to table 2 
       COMMIT
    
调用此存储过程通常会失败

     SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction
    

根据this page here,如果mysql服务器不是以innodb_rollback_on_timeout启动的,那么只有最后一条语句被回滚,但START TRANSACTION本身会设置autocommit = 0。这是否意味着我们的 mysql 服务器需要使用这个参数启动,这样它才不会让 db 处于不一致的状态,即某些行插入到表 1 中而不是插入到表 2 中?

【问题讨论】:

    标签: mysql database transactions locking timeout


    【解决方案1】:

    是的,或者那个,或者你的过程中的declare a handlerFOR '1205'”,你可以(例如)回滚事务并中断进程。

    【讨论】:

      【解决方案2】:

      如果调用客户端检查错误,您可以自行回滚,如果发生错误,您可以回滚事务。如the bug log中所述:

      如果发生行级锁定超时,可能需要允许您的应用程序决定做什么(例如 ROLLBACK、重试语句等),因此此行为添加了一个向后选项如果需要,兼容性。

      否则是的 - 如果您不检查锁定等待错误,并且您总是希望整个事务回滚,那么您应该在 my.cnf 中设置 innodb_rollback_on_timeout

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-23
        • 2011-01-24
        • 2017-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多