我有一些服务,可以执行insert
将新元素插入到我的数据库(Postgresql)的表中。因此从数据库的角度来看,许多insert
服务是并发执行的。
我的问题是是否可以使用表格中的某些列来保持插入顺序。
例如有三个insert
:
INSERT INTO Users (UserName, Id) VALUES ('Tom', 1);
INSERT INTO Users (UserName, Id) VALUES ('Jerry', 2);
INSERT INTO Users (UserName, Id) VALUES ('Joey', 3);
它们正在同时执行。
由于某种原因,第二个insert
被延迟了。在这种情况下,当第三个insert
正在执行时,我期望得到以下两个结果之一:
- 失败
insert
; insert
使用新的 Id成功2
。
是否存在某种机制可以实现这一点?
我为什么需要这个
有一个ID生成器,它使用雪花算法生成ID。并发insert
在多线程中执行。当从表中读取数据时,我想进行如下范围查询:
select * from my_table where Id > a limit 5
select * from my_table where Id > b limit 5
select * from my_table where Id > c limit 5
...
a
,b
并且c
是来自前一个的最后一个 Id select
。
| --- a --- | --- b --- | --- c --- |
问题是,当第二个select
正在执行时,仍然有可能因为并发而使区域处于insert
中状态。如果发生这种情况,我将没有机会读取延迟插入的数据。a
insert
除非您序列化插入而不是并发执行,否则无法做到这一点。这会对您的性能产生很大影响。
其中一种方法是使用表来生成
id
:然后你的插入内容可能是:
表上的更新
counter
会锁定行,只有事务完成后才会释放锁。因此,插入的顺序成为提交的顺序,并且插入的顺序与计数器定义的顺序相同。