超时时innodb回滚

时间:2013-05-23 14:28:37

标签: mysql database transactions locking timeout

我有一个运行存储过程的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中?

2 个答案:

答案 0 :(得分:1)

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

  

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

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

答案 1 :(得分:1)

是的,或者在您的程序中declare a handlerFOR '1205'”,您可以(例如)回滚交易并中断流程。