postgresql 中并发插入查询的 sequence 的 nextval() 和 now() 时间戳的顺序不同

Different order for nextval() of sequence and now() timestamp on concurrent insert queries in postgresql

提问人:Farshan 提问时间:11/16/2023 最后编辑:Farshan 更新时间:11/17/2023 访问量:52

问:

我有一个包含以下列的表格

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

当使用不同的事务同时插入到表中时,和的顺序不同。有什么方法可以使两列按升序排列?StartTimeStartTimeID

更新

下面是我如何使用 .NET Core 控制台应用程序在循环中同时插入记录Parallel.ForEachDapper

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();
SQL PostgreSQL 序列

评论


答: 暂无答案