我想在PostgreSQL中按一定的batchSize来递增序列,但我不确定这个查询是否能够安全地处理对同一序列的并发调用。
select setval('my_sequence', nextval('my_sequence') + batchSize);
我对上述查询感到担忧的是,调用序列的setval()
可能会将序列设置回去,或者可能会中止查询,因为如果另一个线程同时使用nextval()
获取了它。
例如:
线程1:nextval = 1001 batchSize = 100 将序列设置为1101
线程2:nextval = 1002 batchSize = 20 将序列设置为1022
这意味着序列最终可能会返回在1002和1101之间的重复序列ID。
使用generate_series()
函数也可以实现同样的效果。缺点是该序列不能保证按顺序排列,因为其他线程可能会同时调用同一序列的nextval()
,这意味着我必须获取并解析生成的序列。