【发布时间】: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