我正在尝试在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和2台服务器(虚拟机)。复制工作正常,是一个简单的二进制或“热备”复制(主/从)复制,其中备用机器只能进行读操作。
编辑:
我使用查询构建器测试并且INSERT工作正常,但Eloquent失败。
我认为可能是在Eloquent模型中有连接的BUG,但不寻常的是,唯一的INSERT操作失败而不是UPDATE或DELETE,所以这让我觉得这是一些只在发生时才会发生的操作执行INSERT(可能使用生成的ID?)
编辑2:
我终于注意到了这个问题。当Laravel尝试插入并获取行的Id时,会发生错误。问题发生的原因是框架调用了'select'方法但是这个选择执行和“INSERT ...返回'ID'”,所以如果机器只能执行SELECT事务失败,因为这个SELECT带有INSERT。
我发出一个pull请求,我检查select方法是否以'insert'操作开始,并根据它获取正确的连接 https://github.com/laravel/framework/pull/4914