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

q7solyqu  于 2024-01-05  发布在  Spring
关注(0)|答案(4)|浏览(337)

我在spring mvc上开发的应用程序上看到了内部服务器错误,使用wildfly作为web服务器,数据库是PostgreSQL。这个异常是什么意思?

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

字符串
我试着在stackoverflow上寻找解决方案,但没有找到任何可以解决这个问题的方法。

bqujaahr

bqujaahr1#

函数nextval()用于递增一个序列,该序列修改数据库的状态。
你得到这个错误是因为你是在一个只读事务中。
1.您使用START TRANSACTION READ ONLY或类似工具显式启动了一个只读事务。
1.配置参数default_transaction_read_only设置为on
1.您已连接到流式复制备用服务器。
如果default_transaction_read_only设置为on,则可以使用

  1. START TRANSACTION READ WRITE;

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

  1. ALTER SYSTEM SET default_transaction_read_only = off;

nbnkbykc

nbnkbykc2#

正如其他人所指出的,nextval()实际上更新数据库以获得新的序列,因此不能在标记为只读的事务中使用。
由于您使用的是Spring,我怀疑这意味着您使用的是spring-transaction支持。如果您使用的是基于注解的transaction支持,那么您将获得一个只读transaction,如果您有

  1. @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

ghhkc1vu

ghhkc1vu3#

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

  1. t=# create sequence so49;
  2. CREATE SEQUENCE
  3. t=# begin;
  4. BEGIN
  5. t=# select nextval('so49');
  6. nextval
  7. ---------
  8. 1
  9. (1 row)
  10. t=# set transaction_read_only TO on;
  11. SET
  12. t=# select nextval('so49');
  13. ERROR: cannot execute nextval() in a read-only transaction
  14. t=# end;
  15. ROLLBACK

字符串
我假设您连接为所谓的ro用户,即“transaction_read_only”设置为true的用户,例如:

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


当然,你可以为你的用户关闭它,但我认为这超出了范围,
https://www.postgresql.org/docs/current/static/sql-set-transaction.html

展开查看全部
wfauudbj

wfauudbj4#

在我的情况下,这个错误的原因是因为我连接到集群的特定节点,而不是主HAR集群URL。在某个时刻,节点切换其状态,这个错误已经出现。所以,首先检查您的连接,如果有机会,它是一个集群。

相关问题