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



>我可以在Spring mvc上开发的应用程序上看到内部服务器错误,使用Wildfly作为网络服务器和数据库PostgreSQL。此例外意味着什么?

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位,并改为创建常规可写事务。

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 的用户,例如:

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

最新更新