【问题标题】:Laravel - Schema - MySql - Temp Table "Already Exists"Laravel - 架构 - MySql - 临时表“已经存在”
【发布时间】:2017-07-04 04:47:22
【问题描述】:

我将 Laravel 5.4 用于 Web 应用程序,将 RabbitMQ 用于消息队列层,并使用 Laravel 队列工作者。我有两个相关的问题:

临时表

我的构造函数中有以下表格创建代码:

Schema::create('tmp_products', function (Blueprint $table) {
            $table->temporary();
            $table->integer('id');
            $table->string('alias',     255);
            $table->string('include',   255)->nullable();
            $table->string('exclude',   255)->nullable();
        });

注意使用

$table->temporary();

当此进程的多个实例同时运行时,我收到以下错误:

PDOException:SQLSTATE[42S01]:基表或视图已存在:1050 表 'tmp_products' 已存在于 /var/www/myproject/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php 中: 91

起初我认为该表可能不是临时的,但是我在 MySQL Workbench 中没有看到该表,因此不太可能。

也许多个进程似乎正在共享连接状态(因为临时表是特定于会话的)。 该代码作为 Laravel php artisan queue:worker 命令运行,由 supervisord(使用 numprocs=3)管理,我可以在 htop 中看到三个具有唯一 PID 的进程,所以我不明白它们如何共享连接状态.

队列 - 失败的作业

更有趣的是,我使用--tries=0 标志运行队列工作程序(即不重试 处理消息),因此在job->handle() 方法中引发上述异常后,消息应该立即转移到 Laravel failed_jobs 表,但我看到的是一个无限循环的异常,并且消息永远不会离开队列。

所以我想我的问题是:

  1. queue:worker 进程如何共享数据库连接状态
  2. 为什么这种特殊情况会阻止消息失败,而如果我在我的 handle() 函数中显式 throw new Exception();,它们确实会按预期失败

感谢任何帮助。

谢谢,

编辑:我知道为什么失败的作业没有进入failed_jobs 表。将--tries=0 设置为零似乎会使工作永远尝试。将其设置为 1 即可解决此问题。

更新:使用原始 PDO 时出现同样的错误:

$pdo = DB::connection()->getPdo();
$pdo->exec("CREATE TABLE tmp_products (id INT NOT NULL, alias VARCHAR(255) NOT NULL, include VARCHAR(255) NULL, exclude VARCHAR(255) NULL, PRIMARY KEY (id));");

【问题讨论】:

  • 尝试调试(使用 xdebug 或 phpdbg),看看实际发生了什么,使用什么连接/驱动程序。看起来有些配置错误。

标签: mysql laravel rabbitmq message-queue temp-tables


【解决方案1】:

好的,我想通了。我完全误解了 Laravel 工人的运作方式。在我的脑后,我认为它们像 apache 一样工作——在后台为每项工作生成一个工作人员——并在完成后销毁每个工作人员。不是这种情况。每个工作人员依次侦听队列、等待和处理作业。它不会在每个作业上重新创建数据库会话。

顺便说一句,这意味着相同的错误可能会影响单个工作人员,在它处理的第二个作业上。

所以我上一份工作的临时表在下一份工作中仍然存在。现在我只是检查一下,如果表存在,请不要重新创建。

谢谢

【讨论】:

    猜你喜欢
    • 2018-10-13
    • 2014-02-09
    • 2016-08-18
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多