2017-04-05 41 views
1

我可以在spring mvc上開發的應用程序上看到內部服務器錯誤,使用wildfly作爲網絡服務器,數據庫爲PostgreSQL。這個例外是什麼意思?錯誤:無法在只讀事務中執行nextval() - PostgreSQL

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

它以前工作得很好。我試圖在這裏找到解決方案在stackoverflow但沒有找到任何可以解決這個問題。

+0

你的問題是什麼? –

+0

解決方案是什麼?這個異常顯示了什麼? –

+1

它說,你不能用'NEXTVAL()',它增加一個序列,因此是寫入操作時,在只讀事務。您之前可能在讀寫事務中,並且您的配置切換爲只讀事務,原因是我們無法僅使用錯誤消息進行調查。 –

回答

0

我意味着什麼,它說,這裏是例子:

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

1

函數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; 
+0

default_transaction_read_only如何將其更改爲關閉? –

+0

我已經擴展了答案來涵蓋此。 –

+0

謝謝你。 –

1

更改設置正如其他人指出nextval()實際上更新數據庫以獲得一個新的序列,所以不能用於交易標記爲只讀。

當你使用Spring我懷疑這意味着你正在使用spring-transaction支持。如果您使用基於註解的事務支持,那麼你,如果你有

@Transactional(readOnly=true) 

得到一個只讀交易這意味着,當春天開始交易就會把它變成只讀模式。

刪除readOnly=true位,而是創建一個常規的可寫事務。

春季交易控制在http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html

相關問題