我有两个线程,这两个线程都试图阻止在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子句更新序列。
一种方法是使用INCREMENT BY 20
:
CREATE SEQUENCE sequence_name START 1 INCREMENT BY 20;