我有一个运行存储过程的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中?
答案 0 :(得分:1)
如果调用客户端检查错误并在发生错误时回滚事务,则可以自行回滚。如the bug log中所述:
如果行级别锁定超时,可能需要允许您的应用程序决定做什么(例如ROLLBACK,重试语句等等),因此添加了此行为以及向后选项如果需要,兼容性。
否则是 - 如果您没有检查锁定等待错误,并且总是希望整个事务回滚,那么您应该在my.cnf中设置innodb_rollback_on_timeout
。 / p>
答案 1 :(得分:1)
是的,或者在您的程序中declare a handler“FOR '1205'
”,您可以(例如)回滚交易并中断流程。