如何有效地阻止PostgreSQL中的序列

问题描述 投票:0回答:1

我有两个线程,这两个线程都试图阻止在postgres中形成序列的20个项目。

以下查询在没有并发时可以很好地工作:

select last_value + 1 as start_seq,
  setval('sequence_name',
         (select last_value + 20 from sequence_name)) as end_seq
from sequence_name

If sequence's last value is 100, 
Thread T1 will get start_seq as 101 and end_seq as 120
Thread T2 will get start_seq as 121 and end_seq as 140
[considering T1 is started after T2]

现在假定两个线程试图同时阻止20个项目。 T1和T2都可能将start_seq设置为101,将end_seq设置为120。

是否有一种方法可以用来原子地阻止序列?

我尝试通过'RETURNING'关键字使用'update with select':

update sequence_name
  set last_value = last_value + 20
returning last_value - 20 + 1, last_value;

但是会引发错误-'无法更改序列'sequence_name',从本质上讲,您无法使用update子句更新序列。

postgresql sequence updates atomic
1个回答
0
投票

一种方法是使用INCREMENT BY 20

CREATE SEQUENCE sequence_name START 1 INCREMENT BY 20;
© www.soinside.com 2019 - 2024. All rights reserved.