实际上我们对某些方法使用了@Transactional(readOnly=true)
,但这些方法以某种方式执行nextVal((,这对于其他数据库来说很好,但在Postgres 9.6.3上,它会导致以下错误。
cannot execute nextval() in a read-only transaction
我正在浏览Postgres邮件日志,发现此错误仅在8.4.2之后出现 https://www.postgresql.org/message-id/BANLkTik9ikVUU-bznOhZHmLbdEx5fverCw%40mail.gmail.com
有什么办法可以在数据库级别解决此问题。
https://www.postgresql.org/docs/current/static/functions-sequence.html
前进序列并返回新值
所以它会更改值 - 这在只读事务中无法完成。
更新
set transaction_read_only to on;
使会话只读,而不仅仅是事务(SET LOCAL
就是这种情况(
从您的链接中引用克雷格
以前 9.0,Pg 只是没有注意到并警告你。
所以之前有一个错误,当你没有被警告时。 但是NextVal没有在下一个值上滚动
没有什么可以修复她 - 要么set transaction_read_only to off
并推进序列,要么使用currval
. 你可以有一个只读事务,但修改数据 - 逻辑在哪里?..