队列完成了,但是数据并没有保存到,数据库查询时,有一个进程沉睡了,并且锁死了对应的表

1. 运行环境

1). 当前使用的 Laravel 版本?

Laravel Framework 7.30.6

2). 当前使用的 php/php-fpm 版本?

PHP 版本:

PHP 7.4.30 (cli) (built: Nov 18 2022 17:17:33) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.30, Copyright (c), by Zend Technologies

3). 当前系统

linux

4). 业务环境

开发环境

5). 相关软件版本

阿里云mysql

2. 问题描述?

单独开了一个队列,用的redis存的队列数据
守护进程配置

队列完成了,但是数据并没有保存到,数据库查询时,有一个进程沉睡了,并且锁死了对应的表

当前日志
队列完成了,但是数据并没有保存到,数据库查询时,有一个进程沉睡了,并且锁死了对应的表
守护进程的日志
队列完成了,但是数据并没有保存到,数据库查询时,有一个进程沉睡了,并且锁死了对应的表

代码

队列完成了,但是数据并没有保存到,数据库查询时,有一个进程沉睡了,并且锁死了对应的表

3. 您期望得到的结果?

事务正常,队列也正常,不出现锁的情况,目前锁的情况改成单队列消费模式,其他表查询的同一条数据的情况很低

4. 您实际得到的结果?

奇怪的问题是,设置了超时,假设锁表了,超时不也应该自动失败
但是观测日志,队列任务完成了,事务应该提交了,正常来说也不会回滚保存的数据才对,跟锁表或者卡的关系有多大呢?
数据库卡的时候,就出现下面的结果,然后终止进程之后,重启队列后,事务有恢复正常保存的情况

可以看到事务锁等待的意思?目前就是这样情况,记录与18:13分
队列完成了,但是数据并没有保存到,数据库查询时,有一个进程沉睡了,并且锁死了对应的表

然后看了下队列日志也是消费,但是出现里面这个队列,目前消费成功的队列数据看数据库是失败的,没有提交事务成功

队列完成了,但是数据并没有保存到,数据库查询时,有一个进程沉睡了,并且锁死了对应的表
下面是新的日志,进程号也是对应上的
队列完成了,但是数据并没有保存到,数据库查询时,有一个进程沉睡了,并且锁死了对应的表

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 13

數據庫沒有鎖住吧 因為隊列連接mysql是長連接 連接不會被釋放 除非進程結束了

1年前 评论
amosmz (楼主) 1年前
随波逐流

是不是贴错job了

1年前 评论
amosmz (楼主) 1年前

file

1.开始事务放try外面。
2.异常收集要记下日志:异常抛出信息-错误信息-代码行数

1年前 评论
amosmz (楼主) 1年前
amosmz (楼主) 1年前
xiusin 1年前
amosmz (楼主) 1年前
陈先生 1年前
随波逐流

从上面的日志来看,job没有异常,应该问题不大。

可以从几方面着手改善问题:

  1. 队列使用 redis 驱动
  2. 代码事务 使用 DB::transaction() 提交。
1年前 评论
amosmz (楼主) 1年前
xiaochong0302

看看有没有这方面的原因:cli下面的程序,数据库链接可能会超时丢失的(默认8小时),你要主动和数据库通信。

1年前 评论

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