我有两个线程,这两个线程都试图阻止 20 个项目在 postgres 中形成一个序列。
当没有并发时,以下查询可以正常工作:
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 子句更新序列。