php 为什么我的一些laravel队列作业执行两次,并在数据库中更新两次余额?

s5a0g9ez  于 2023-09-29  发布在  PHP
关注(0)|答案(1)|浏览(130)

我使用laravel 8为我的应用程序,一切都工作正常,除了有时我的队列作业运行两次,这导致数据库分类帐余额更新两次。
我以前也发现过这个问题,但忽略了我的代码可能是错误的,但昨天我也遇到了同样的问题。这个问题并不是发生在所有的工作岗位上,而是发生在极少数的工作岗位上,比如100个工作岗位中的1-2个。我正在使用数据库驱动程序来管理作业。
下面是我的代码实现
我在工作文件中使用以下内容

use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public $retryAfter = 85; 
    public $timeout = 80;
    public $tries = 3;

我的代码没有调用作业两次,我已经检查了它,我也使用管理员管理队列,我已经附加了管理员配置。
我正在使用下面的代码来分派工作

UpdateDailyLedgerReport::dispatch($this->ledger_id, $this->name, $type, $date, $amount);

我已经检查了我的代码多次,但没有两次调用作业的痕迹,事情是在更新两个分类帐余额的某个时候,即具有相等金额的模型,一个模型正在使用正确的金额进行更新,但第二个模型余额更新了两次。
我在另一份工作中也遇到了同样的问题。
谢谢.
以前我的工作超时只有30秒,但我已经增加了它,仍然存在的问题。
刚才我检查了一下,发现以下是导致isseus的原因:
SQLSTATE[40001]:序列化失败:1213尝试获取锁时发现死锁;尝试重新启动事务(SQL:delete from jobs where id = 10892){“exception”:“[object](Illuminate\Database\QueryException(code:40001):SQLSTATE[40001]:序列化失败:1213尝试获取锁时发现死锁;尝试重新启动事务(SQL:从作业中删除,其中ID = 10892)在/var/www/vhosts/jobbooks.in/httpdocs/vendor/laravel/framework/src/Illuminate/Database/Connection.php:712)
谁能帮我修一下

ego6inou

ego6inou1#

这些作业必须是幂等的。这意味着如果它们执行了不止一次,它们不应该破坏你的逻辑。增加没有作业的分类帐。在部署时,如果没有正确处理sigterm信号,可能会发生这种情况。
How to handle SIGTERM signal on laravel 8,9,10 deploy with docker containers in regards to scheduler and worker?

相关问题