【发布时间】:2015-12-05 04:54:18
【问题描述】:
我正在使用 Laravel 5.1。
队列用于在多个系统之间获取/同步数据。
我使用数据库驱动,3个“artisan queue:work --daemon”进程一直在运行。
作业由系统用户和调度程序 (cron) 分派。三个队列用于确定作业的优先级。
一切似乎都运行良好 - 作业表中充满了记录,系统会处理它们并删除已完成的记录。
但是,一段时间后,锁定问题开始出现影响:
SQLSTATE[40001]: 序列化失败: 1213 Deadlock found when 试图获得锁;尝试重启事务
和
'RuntimeException' 带有消息'Can't swap PDO instance while inside 交易。'
和
SQLSTATE[HY000]:一般错误:1205 超过锁定等待超时;尝试 重启交易
我还没有尝试使用其他队列驱动程序。不过,我真的很想继续使用数据库。引擎是 InnoDB,jobs 表有默认结构和索引。
有没有办法解决这个问题?你有什么想法?
值得一提的是,我在作业类中调用了DB::reconnect(),因为队列工作人员作为守护进程运行。
正如人们所期望的那样,使用DispatchesJobs trait 调度作业。我不会以任何其他方式干扰队列算法。
【问题讨论】:
-
有什么解决办法吗?
-
不。暂时移到beantalkd。虽然我更喜欢 DB 驱动程序,因为我可以通过简单地查看 DB 表来跟踪作业和失败的作业......
-
研究 Laravel 如何处理 MySQL 的“事务”。听起来您已经开始交易,然后坐了很长时间。
COMMIT尽快交易。检查autocommit的使用情况。 -
正确索引和使用 MySQL 事务可以帮助您配对、回溯与锁定表相关的每个模块,以便您可以查明哪个函数或部分代码“生成”了锁定。干杯
-
不,为那个项目使用 beanstalkd。虽然我更喜欢数据库队列
标签: mysql laravel laravel-5 queue innodb