使用队列时发生了 MySQL 死锁

队列使用database

 production.ERROR: SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction (SQL: delete from `jobs` where `id` = 1790893) {"exception":"[object] (Illuminate\\Database\\QueryException(code: 40001): SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction (SQL: delete from `jobs` where `id` = 1790893)
[stacktrace]

我一开始开启了10个队列进程,因为又加了一些队列业务又增加了8个队列进程
运行一段时间后发现在删除队列时会频繁的出现死锁,
我希望能够定位到问题并解决此死锁问题

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案
    /**
     * Delete a reserved job from the queue.
     *
     * @param  string  $queue
     * @param  string  $id
     * @return void
     *
     * @throws \Throwable
     */
    public function deleteReserved($queue, $id)
    {
        $this->database->transaction(function () use ($id) {
            if ($this->database->table($this->table)->lockForUpdate()->find($id)) {
                $this->database->table($this->table)->where('id', $id)->delete();
            }
        });
    }

datebase作为队列引擎时,会开启一个事务同时加上排它锁,还是推荐改成用redis吧。

3年前 评论
oursdreams (楼主) 3年前
cheer (作者) 3年前
oursdreams (楼主) 3年前
讨论数量: 4

很明显mysql的问题,用redis或者rabbit搞吧。

3年前 评论
    /**
     * Delete a reserved job from the queue.
     *
     * @param  string  $queue
     * @param  string  $id
     * @return void
     *
     * @throws \Throwable
     */
    public function deleteReserved($queue, $id)
    {
        $this->database->transaction(function () use ($id) {
            if ($this->database->table($this->table)->lockForUpdate()->find($id)) {
                $this->database->table($this->table)->where('id', $id)->delete();
            }
        });
    }

datebase作为队列引擎时,会开启一个事务同时加上排它锁,还是推荐改成用redis吧。

3年前 评论
oursdreams (楼主) 3年前
cheer (作者) 3年前
oursdreams (楼主) 3年前

这个是从 Laravel/framework 的 Github 中的 Issues 中找到的。

希望这个 issue 对你有帮助

看不懂可以百度翻译~

3年前 评论
直面苦痛的人生

:joy: :sob: :sob: :sob: :sob: :sob: :sleepy: :weary: :sweat: :sweat: :cold_sweat: :cry: :pensive:

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!