postgres UPSERT 完全 atomic/thread 安全吗?

is postgres UPSERT fully atomic/thread safe?

我们正在尝试使用以下查询将数据流式传输到 postgres 11:

INSERT INTO identifier_to_item 
values (:id, :identifier_value, :identifier_type, :identifier_manufacturer, :delivery_timestamp_utc, :item)
ON CONFLICT (identifier_value, manufacturer, type) DO UPDATE 
SET item = :item, delivery_timestamp_utc = :delivery_timestamp_utc 
WHERE identifier_to_item.delivery_timestamp_utc < :delivery_timestamp_utc

基本上"insert record in the table, if it already exists -> optionally override some fields based on the data already stored in the database".

我们想将此查询挂钩到消息队列,并 运行 它在多个实例的高并发环境中。使用此查询可能会从不同的连接访问同一行。对我们而言,至关重要的是只有具有最高交付时间戳的项目才能最终到达 table

根据文档:

ON CONFLICT DO UPDATE guarantees an atomic INSERT or UPDATE outcome; provided there is no independent error, one of those two outcomes is guaranteed, even under high concurrency.

但也在访问 UPDATE WHERE 部分原子和线程安全的字段?此语句是否使用某种悲观 row/table 锁定?

PostgreSQL 没有在服务器端使用线程。

PostgreSQL 不实现 pessimistic/optimistic 行级锁定:由应用程序决定实现悲观或乐观锁定。

PostgreSQL 不会将行级锁升级为 table 锁。