3

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

根据此处的此页面,如果未启动 mysql 服务器,innodb_rollback_on_timeout则仅回滚最后一条语句,但START TRANSACTION其自身将设置autocommit = 0。这是否意味着我们的 mysql 服务器需要使用此参数启动,以便它不会使 db 处于不一致的状态,即某些行插入到表 1 中而不是插入到表 2 中?

4

2 回答 2

2

是的,要么,要么在你的过程中声明一个处理程序FOR '1205'”,你可以(例如)回滚事务并中断进程。

于 2013-05-23T14:44:15.897 回答
1

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

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

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

于 2013-05-23T14:43:47.760 回答