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