繁体   English   中英

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

[英]ERROR: cannot execute nextval() in a read-only transaction - PostgreSQL

在使用wildfly作为Web服务器和数据库是PostgreSQL Spring MVC开发的应用程序上,我可以看到内部服务器错误。 此异常是什么意思?

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

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

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

您收到该错误,因为您处于只读事务中。 发生这种情况是因为

  1. 您已使用START TRANSACTION READ ONLY或类似内容显式启动了只读事务。

  2. 配置参数default_transaction_read_only设置为on

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

如果将default_transaction_read_only设置为on ,则可以使用以下命令启动读写事务

START TRANSACTION READ WRITE;

或通过编辑postgresql.conf或使用超级用户命令来更改设置

ALTER SYSTEM SET default_transaction_read_only = off;

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

当您使用Spring我怀疑这意味着您在使用spring-transaction支持。 如果您使用的是基于注释的交易支持,那么您将获得只读交易

@Transactional(readOnly=true)

这意味着,当spring启动事务时,它将进入只读模式。

删除readOnly=true位,而是创建一个常规的可写事务。

Spring交易控制位于http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html

我的意思就是它的意思,这里是示例:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM