Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 错误:无法在只读事务中执行nextval()-PostgreSQL_Spring_Postgresql - Fatal编程技术网

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

Spring 错误:无法在只读事务中执行nextval()-PostgreSQL,spring,postgresql,Spring,Postgresql,我可以在SpringMVC上开发的应用程序上看到内部服务器错误,使用wildfly作为Web服务器,数据库是PostgreSQL。这个例外意味着什么 ERROR: cannot execute nextval() in a read-only transaction 以前一切正常。我试图在stackoverflow上寻找解决方案,但没有找到任何可以解决此问题的方法 我的意思正是它所说的,下面是一个例子: t=# create sequence so49; CREATE SEQUENCE t=#

我可以在SpringMVC上开发的应用程序上看到内部服务器错误,使用wildfly作为Web服务器,数据库是
PostgreSQL
。这个例外意味着什么

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

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

我的意思正是它所说的,下面是一个例子:

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)
当然,你可以为你的用户关闭它,但我相信这超出了范围


我的意思正是它所说的,下面是一个例子:

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)
当然,你可以为你的用户关闭它,但我相信这超出了范围

该函数用于增加序列,从而修改数据库的状态

由于您处于只读事务中,因此会出现该错误。这可能是因为

  • 您使用
    START transaction read only
    或类似工具显式启动只读事务

  • 配置参数
    default\u transaction\u read\u only
    设置为
    on

  • 您已连接到流式复制备用服务器

  • 如果
    default\u transaction\u read\u only
    设置为
    on
    ,则您可以使用

    START TRANSACTION READ WRITE;
    
    或者通过编辑
    postgresql.conf
    或使用超级用户命令更改设置

    ALTER SYSTEM SET default_transaction_read_only = off;
    
    该函数用于增加一个序列,该序列修改数据库的状态

    由于您处于只读事务中,因此会出现该错误。这可能是因为

  • 您使用
    START transaction read only
    或类似工具显式启动只读事务

  • 配置参数
    default\u transaction\u read\u only
    设置为
    on

  • 您已连接到流式复制备用服务器

  • 如果
    default\u transaction\u read\u only
    设置为
    on
    ,则您可以使用

    START TRANSACTION READ WRITE;
    
    或者通过编辑
    postgresql.conf
    或使用超级用户命令更改设置

    ALTER SYSTEM SET default_transaction_read_only = off;
    

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

    当您使用
    Spring
    时,我怀疑这意味着您正在使用Spring事务支持。如果您使用的是基于注释的事务支持,那么如果您有

    @Transactional(readOnly=true)
    
    这意味着,当spring启动事务时,它将把它置于只读模式

    删除
    readOnly=true
    位,然后创建一个常规的可写事务


    Spring transaction control at

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

    当您使用
    Spring
    时,我怀疑这意味着您正在使用Spring事务支持。如果您使用的是基于注释的事务支持,那么如果您有

    @Transactional(readOnly=true)
    
    这意味着,当spring启动事务时,它将把它置于只读模式

    删除
    readOnly=true
    位,然后创建一个常规的可写事务


    Spring transaction control at

    您的问题是什么?解决方案是什么?这个异常显示了什么?它表示您不能在只读事务中使用增加序列的
    nextVal()
    ,因此是一个写操作。您以前可能处于读写事务中,并且您的配置切换为只读事务,原因是我们无法仅通过错误消息进行调查。是,听起来我正在做一些与事务处于只读模式时的写操作相关的事情。现在,您必须了解DAL是如何和/或为什么创建只读事务的。也许你只是和一个RO用户联系。你的问题是什么?解决方案是什么?这个异常显示了什么?它表示您不能在只读事务中使用增加序列的
    nextVal()
    ,因此是一个写操作。您以前可能处于读写事务中,并且您的配置切换为只读事务,原因是我们无法仅通过错误消息进行调查。是,听起来我正在做一些与事务处于只读模式时的写操作相关的事情。现在,您必须了解DAL是如何和/或为什么创建只读事务的。也许你只是联系了一个RO用户。我扩展了答案以涵盖这一点。我扩展了答案以涵盖这一点。