簡體   English   中英

錯誤:無法在只讀事務中執行nextval()-PostgreSQL

[英]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()用於遞增序列,該序列修改數據庫的狀態。

您收到該錯誤,因為您處於只讀事務中。 發生這種情況是因為

  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位,而是創建一個常規的可寫事務。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM