无法在只读事务中执行nextval()

时间:2017-08-23 13:24:29

标签: postgresql jpa

实际上我们使用library(data.table) dt = data.table("date-time"=c(as.POSIXct(c("2017-08-23 07:49:38", "2017-08-23 07:49:48", "2017-08-23 07:49:58", "2017-08-23 07:50:08", "2017-08-23 07:50:18", "2017-08-23 07:50:28" ))), RSSI=c(-68, -69, -59, -65, 127, -74)) dt[RSSI > 0 , RSSI:=NA] #replacing positive ones with NA print(dt) dt[ , minute:=floor(as.numeric(`date-time`)/60)] # calculate for each time in which minute it belongs # calculate mean and standard deviation per group dt[ , c("mean", "stdev") := list(mean(RSSI, na.rm=TRUE), sd(RSSI, na.rm=TRUE)), by = minute] #ignoring the NA outliers dt[ abs(RSSI - mean) > stdev | is.na(RSSI), RSSI:=round(mean)] #round should return an integer print(dt) 来表示某些方法,但这些方法以某种方式执行nextVal(),这对其他数据库来说很好,但在Postgres 9.6.3上会导致以下错误。

@Transactional(readOnly=true)

我正在浏览Postgres Mail日志,并发现此错误仅在8.4.2 https://www.postgresql.org/message-id/BANLkTik9ikVUU-bznOhZHmLbdEx5fverCw%40mail.gmail.com

之后发生

有没有办法在数据库级别修复此问题。

1 个答案:

答案 0 :(得分:0)

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。你可以有一个只读事务,然后修改数据 - 逻辑在哪里?..