无法在只读事务中执行INSERT - Laravel 读写

5

我正在尝试在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',
    ],
]

我正在使用两台虚拟机的Postgres 9.3。复制正常运作,并采用简单的二进制或“热备份”复制(主/从),其中备用机器只能进行读取操作。
编辑:
我尝试使用查询构建器,INSERT操作正常,但使用Eloquent失败。
我认为可能是Eloquent模型中连接存在BUG,但不寻常的是仅INSERT操作失败,而UPDATE或DELETE没有问题,这使我认为是某个仅在执行INSERT时发生的操作(也许是生成的ID?)
编辑2:
最终我注意到了问题所在。当Laravel尝试插入并获取行的ID时,错误就会发生。问题出现在框架调用“select”方法时,但此select执行的是“INSERT ... returning 'ID'”,因此,如果机器只能执行SELECT事务,则此SELECT将与INSERT一起失败。
我提出了一个pull request,在其中检查select方法是否以'insert'操作开头,并根据情况获取正确的连接。 https://github.com/laravel/framework/pull/4914

1
听起来你的应用程序正在尝试进行查询路由,自动将读/写查询发送到主服务器和只读查询发送到副本。但是它做错了。 - Craig Ringer
1个回答

0

这个 Bug 最终被修复了,我相信自从 4.2.9 版本以来不应该再有问题了。请查看相同的链接以获取拉取请求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接