2017-08-23 37 views
1

実際にはいくつかのメソッドには@Transactional(readOnly=true)を使用しましたが、これらのメソッドは他のデータベースではうまくいく方法でnextVal()を実行しますが、Postgres 9.6.3では以下のエラーが発生します。は読み取り専用トランザクションでnextval()を実行できません

cannot execute nextval() in a read-only transaction 

私はPostgresのメールのログを通過すると、このエラーが唯一の8.4.2 https://www.postgresql.org/message-id/BANLkTik9ikVUU-bznOhZHmLbdEx5fverCw%40mail.gmail.com

後に来ているところDBレベルでこの問題を解決するためにそこにどのような方法がありますがわかりました。

答えて

0

https://www.postgresql.org/docs/current/static/functions-sequence.html

事前シーケンスと

新しい値を返すので、それは値に変更 - 読み取り専用のトランザクションで実行することはできません。

更新

set transaction_read_only to on; 

は、セッションが

9.0前に、あなたのリンクからクレイグを引用

SET LOCALの場合になります)のみだけでなく、トランザクションを読んでますPgは気付かず、あなたに警告しませんでした。

警告が表示されていないと、先にバグがありました。 nextvalは次の値にロールしませんでした

set transaction_read_only to offのいずれかを修正するか、またはcurrvalを使用してください。

+0

私はあなたの意見は理解していますが、Oracleとmysqlのシーケンス生成は完全にトランザクションが崩れているため、同じことが分かります。また、postgresは-a nextval操作も示しています決してロールバックされません。 –

+0

postgresの読み取り専用トランザクションスコープからnextValを入れる方法はありますか? –

+0

非常に良い点 - nextvalはトランザクション部分ではOKですが、 "read only"に対しては反対です。 'transaction_read_only'を' on'に設定した場合、トランザクションだけでなく読み取り専用セッションになります。多分それはあまりにも良い設定のための命名ではありません... –

関連する問題