提问人:Farshan 提问时间:11/16/2023 最后编辑:Farshan 更新时间:11/17/2023 访问量:52
postgresql 中并发插入查询的 sequence 的 nextval() 和 now() 时间戳的顺序不同
Different order for nextval() of sequence and now() timestamp on concurrent insert queries in postgresql
问:
我有一个包含以下列的表格
CREATE Table SeqTest
(
Id BIGSERIAL PRIMARY KEY NOT NULL,
StartTime TIMESTAMP NULL,
StartTimeID BIGINT NULL
);
我使用以下命令创建了一个序列
CREATE SEQUENCE seqtestid_seq;
插入查询
INSERT INTO SeqTest (StartTime, StartTimeID)
VALUES (NOW() AT TIME ZONE 'UTC', NEXTVAL('seqtestid_seq'));
并发测试时的查询输出
test_db=# SELECT * FROM SeqTest order by starttime asc;
id | starttime | starttimeid
-----+----------------------------+-------------
309 | 2023-11-16 11:18:41.008201 | 409
305 | 2023-11-16 11:18:41.008202 | 405
307 | 2023-11-16 11:18:41.008222 | 407
310 | 2023-11-16 11:18:41.008334 | 411
308 | 2023-11-16 11:18:41.008337 | 408
311 | 2023-11-16 11:18:41.008757 | 410
304 | 2023-11-16 11:18:41.008762 | 404
306 | 2023-11-16 11:18:41.008784 | 406
312 | 2023-11-16 11:18:41.009812 | 412
当使用不同的事务同时插入到表中时,和的顺序不同。有什么方法可以使两列按升序排列?StartTime
StartTimeID
更新
下面是我如何使用 .NET Core 控制台应用程序在循环中同时插入记录Parallel.ForEach
Dapper
public static async Task TestSeqQuery()
{
using (var conn = GetConnection())
{
conn.Open();
using (var tran = conn.BeginTransaction())
{
string sql = @"INSERT INTO SeqTest (StartTime, StartTimeID) VALUES (NOW() AT TIME ZONE 'utc', nextval('seqtestid_seq'));";
var result = await conn.ExecuteAsync(sql, tran);
tran.Commit();
}
}
}
...
Parallel.ForEachAsync(Enumerable.Range(0, 100), async (i, ct) =>
{
await TestSeqQuery();
}).GetAwaiter().GetResult();
答: 暂无答案
评论