[英]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()
用于递增序列,该序列修改数据库的状态。
您收到该错误,因为您处于只读事务中。 发生这种情况是因为
您已使用START TRANSACTION READ ONLY
或类似内容显式启动了只读事务。
配置参数default_transaction_read_only
设置为on
。
您已连接到流复制备用服务器。
如果将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.