我在spring mvc上开发的应用程序上看到了内部服务器错误,使用wildfly作为web服务器,数据库是PostgreSQL。这个异常是什么意思?
PostgreSQL
ERROR: cannot execute nextval() in a read-only transaction
字符串我试着在stackoverflow上寻找解决方案,但没有找到任何可以解决这个问题的方法。
bqujaahr1#
函数nextval()用于递增一个序列,该序列修改数据库的状态。你得到这个错误是因为你是在一个只读事务中。1.您使用START TRANSACTION READ ONLY或类似工具显式启动了一个只读事务。1.配置参数default_transaction_read_only设置为on。1.您已连接到流式复制备用服务器。如果default_transaction_read_only设置为on,则可以使用
nextval()
START TRANSACTION READ ONLY
default_transaction_read_only
on
START TRANSACTION READ WRITE;
字符串或通过编辑postgresql.conf或使用超级用户命令更改设置
postgresql.conf
ALTER SYSTEM SET default_transaction_read_only = off;
型
nbnkbykc2#
正如其他人所指出的,nextval()实际上更新数据库以获得新的序列,因此不能在标记为只读的事务中使用。由于您使用的是Spring,我怀疑这意味着您使用的是spring-transaction支持。如果您使用的是基于注解的transaction支持,那么您将获得一个只读transaction,如果您有
Spring
@Transactional(readOnly=true)
字符串这意味着当spring启动transaction时,它会将其置于只读模式。删除readOnly=true位,然后创建一个常规的可写事务。Spring transaction control at http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html
readOnly=true
ghhkc1vu3#
我的意思正是它所说的,这里有一个例子:
t=# create sequence so49;CREATE SEQUENCEt=# begin;BEGINt=# select nextval('so49'); nextval--------- 1(1 row)t=# set transaction_read_only TO on;SETt=# select nextval('so49');ERROR: cannot execute nextval() in a read-only transactiont=# end;ROLLBACK
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=# end;
ROLLBACK
字符串我假设您连接为所谓的ro用户,即“transaction_read_only”设置为true的用户,例如:
t=# select rolconfig from pg_roles where rolname ='ro'; rolconfig---------------------------- {transaction_read_only=on}(1 row)
t=# select rolconfig from pg_roles where rolname ='ro';
rolconfig
----------------------------
{transaction_read_only=on}
型当然,你可以为你的用户关闭它,但我认为这超出了范围,https://www.postgresql.org/docs/current/static/sql-set-transaction.html
wfauudbj4#
在我的情况下,这个错误的原因是因为我连接到集群的特定节点,而不是主HAR集群URL。在某个时刻,节点切换其状态,这个错误已经出现。所以,首先检查您的连接,如果有机会,它是一个集群。
4条答案
按热度按时间bqujaahr1#
函数
nextval()
用于递增一个序列,该序列修改数据库的状态。你得到这个错误是因为你是在一个只读事务中。
1.您使用
START TRANSACTION READ ONLY
或类似工具显式启动了一个只读事务。1.配置参数
default_transaction_read_only
设置为on
。1.您已连接到流式复制备用服务器。
如果
default_transaction_read_only
设置为on
,则可以使用字符串
或通过编辑
postgresql.conf
或使用超级用户命令更改设置型
nbnkbykc2#
正如其他人所指出的,
nextval()
实际上更新数据库以获得新的序列,因此不能在标记为只读的事务中使用。由于您使用的是
Spring
,我怀疑这意味着您使用的是spring-transaction支持。如果您使用的是基于注解的transaction支持,那么您将获得一个只读transaction,如果您有字符串
这意味着当spring启动transaction时,它会将其置于只读模式。
删除
readOnly=true
位,然后创建一个常规的可写事务。Spring transaction control at http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html
ghhkc1vu3#
我的意思正是它所说的,这里有一个例子:
字符串
我假设您连接为所谓的ro用户,即“transaction_read_only”设置为true的用户,例如:
型
当然,你可以为你的用户关闭它,但我认为这超出了范围,
https://www.postgresql.org/docs/current/static/sql-set-transaction.html
wfauudbj4#
在我的情况下,这个错误的原因是因为我连接到集群的特定节点,而不是主HAR集群URL。在某个时刻,节点切换其状态,这个错误已经出现。所以,首先检查您的连接,如果有机会,它是一个集群。