Postgres UPSERT是否完全原子/线程安全?

问题描述 投票:0回答:1

我们正在尝试使用以下查询将数据流式传输到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

基本上是“在表中插入记录,如果已经存在->可以根据已经存储在数据库中的数据来选择覆盖某些字段”。

我们希望将此查询挂接到消息队列,并在多个实例中的高并发环境中运行它。使用此查询可能会从不同的连接访问同一行。对我们来说,至关重要的是,只有具有最高交付时间戳记的商品才能最终进入表格

根据文档:

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部分中原子和线程安全的字段吗?此语句是否使用某种悲观的行/表锁定?

postgresql concurrency upsert concurrentmodification
1个回答
0
投票

PostgreSQL在服务器端未使用线程。

PostgreSQL未实现悲观/乐观行级别锁定:应用程序有权决定实现悲观或乐观锁定。

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

© www.soinside.com 2019 - 2024. All rights reserved.