【问题标题】:Cannot execute INSERT in a read-only transaction - Laravel read/write无法在只读事务中执行 INSERT - Laravel 读/写
【发布时间】:2014-06-30 22:23:23
【问题描述】:

我正在尝试在 Laravel 4.2.6 中设置读/写连接,但我无法执行 INSERT,但我可以执行 UPDATE 和 DELETE 事务。我得到的信息是:

SQLSTATE[25006]: Read only sql transaction: 7 ERROR:  cannot execute INSERT in a read-only transaction

数据库的配置是:

'connections' => [
    'pgsql' => [
        'read'     => [
            'host' => '192.168.22.10'
        ],
        'write'     => [
            'host' => '192.168.33.10'
        ],
        'driver'   => 'pgsql',
        'database' => 'simpo',
        'username' => 'postgres',
        'password' => 'xxx',
        'charset'  => 'utf8',
        'prefix'   => '',
        'schema'   => 'public',
    ],
]

我正在使用带有 2 个服务器(虚拟机)的 Postgres 9.3。复制工作正常,是一个简单的二进制或“热备”复制(主/从),其中备用机器只能进行读取操作。


编辑:

我使用查询生成器进行了测试,INSERT 工作正常,但使用 Eloquent 失败。

我认为这可能是 Eloquent 模型中连接的 BUG,但不寻常的是唯一的 INSERT 操作失败而不是 UPDATE OR DELETE,所以这让我认为这是一些仅在以下情况下发生的操作执行 INSERT(可能使用生成的 ID?)

编辑 2:

我终于注意到了这个问题。当 Laravel 尝试插入和获取行的 Id 时会发生错误。问题的发生是因为框架调用了一个“选择”方法,但是这个选择执行和“INSERT ...返回'ID'”,所以如果机器只能执行SELECT事务失败,因为这个SELECT带有一个INSERT。

我提出一个拉取请求,检查选择方法是否以“插入”操作开头,并根据该操作获得正确的连接 https://github.com/laravel/framework/pull/4914

【问题讨论】:

  • 听起来您的应用正在尝试进行查询路由,它会自动将读/写查询发送到主服务器,并将只读查询发送到副本。它做错了。

标签: postgresql laravel-4


【解决方案1】:

Bug 终于修复了,我相信从 4.2.9 版本开始应该不会出现问题。签出与拉取请求相同的link

【讨论】:

    猜你喜欢
    • 2019-09-04
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    相关资源
    最近更新 更多