错误:无法在只读事务中执行nextval() - PostgreSQL

时间:2017-04-05 11:28:30

标签: spring postgresql

我可以在spring mvc上开发的app上看到内部服务器错误,使用wildfly作为网络服务器,数据库为PostgreSQL。这个例外是什么意思?

ERROR: cannot execute nextval() in a read-only transaction

之前一切正常。我试图在stackoverflow上寻找解决方案,但没有找到任何可以解决这个问题的方法。

3 个答案:

答案 0 :(得分:3)

函数nextval()用于递增序列,修改数据库的状态。

您收到该错误,因为您处于只读事务中。这可能是因为

  1. 您明确启动了START TRANSACTION READ ONLY或类似的只读交易。

  2. 配置参数default_transaction_read_only设置为on

  3. 您已连接到流式复制备用服务器。

  4. 如果default_transaction_read_only设置为on,您可以使用

    启动读写事务
    START TRANSACTION READ WRITE;
    

    或通过编辑postgresql.conf或使用超级用户命令

    更改设置
    ALTER SYSTEM SET default_transaction_read_only = off;
    

答案 1 :(得分:2)

正如其他人指出nextval()实际更新数据库以获取新序列,因此无法在标记为只读的事务中使用。

当您使用Spring时,我怀疑这意味着您正在使用弹簧交易支持。如果您使用基于注释的交易支持,那么如果您有

,您将获得只读交易
@Transactional(readOnly=true)

这意味着当spring启动事务时,它会将其置于只读模式。

删除readOnly=true位,改为创建常规可写事务。

http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html

的春季交易控制

答案 2 :(得分:0)

我的意思正是它所说的,这里是例子:

t=# create sequence so49;
CREATE SEQUENCE
t=# begin;
BEGIN
t=# select nextval('so49');
 nextval
---------
       1
(1 row)

t=# set transaction_read_only TO on;
SET
t=# select nextval('so49');
ERROR:  cannot execute nextval() in a read-only transaction
t=# end;
ROLLBACK

我认为你连接的是所谓的ro用户,即“transaction_read_only”设置为true的用户,EG:

t=# select rolconfig from pg_roles where rolname ='ro';
         rolconfig
----------------------------
 {transaction_read_only=on}
(1 row)

你当然可以为你的用户关闭它,但这超出了我认为的范围

https://www.postgresql.org/docs/current/static/sql-set-transaction.html