我的代码中有很多事务,如果在其中一个事务中执行时发生错误而没有触发提交或回滚,则数据库被锁定,任何后续访问数据库的尝试都会导致:
production.ERROR:PDOException:sqlSTATE [HY000]:一般错误:1205超出锁定等待超时;尝试重新启动/home/forge/default/vendor/laravel/framework/src/Illuminate/Database/Connection.PHP:390中的事务
在控制器中:
DB::beginTransaction(); try { //Code that uses exec() to process some images. <-- If code breaks here,then the above error appears on subsequent requests. //Code that accesses the database } catch(\Exception $e){ DB::rollback(); throw $e; } DB::commit();
我看到重复的问题
How to debug Lock wait timeout exceeded on MySQL?
您应该考虑通过设置innodb_lock_wait_timeout来增加InnoDB的锁定等待超时值,默认为50秒
MysqL> show variables like 'innodb_lock_wait_timeout'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | innodb_lock_wait_timeout | 50 | +--------------------------+-------+ 1 row in set (0.01 sec)
您可以使用此行永久地在/etc/my.cnf中将其设置为更高的值
[MysqLd] innodb_lock_wait_timeout=120
并重启MysqL.如果此时无法重启MysqL,请运行以下命令:
SET GLOBAL innodb_lock_wait_timeout = 120`;
您也可以在会话期间设置它
SET innodb_lock_wait_timeout = 120;