[英]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()
用於遞增序列,該序列修改數據庫的狀態。
您收到該錯誤,因為您處於只讀事務中。 發生這種情況是因為
您已使用START TRANSACTION READ ONLY
或類似內容顯式啟動了只讀事務。
配置參數default_transaction_read_only
設置為on
。
您已連接到流復制備用服務器。
如果將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.