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
根据文档:
但也在访问 UPDATE WHERE 部分原子和线程安全的字段?此语句是否使用某种悲观 row/table 锁定?
PostgreSQL 没有在服务器端使用线程。
PostgreSQL 不实现 pessimistic/optimistic 行级锁定:由应用程序决定实现悲观或乐观锁定。
PostgreSQL 不会将行级锁升级为 table 锁。
我们正在尝试使用以下查询将数据流式传输到 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
根据文档:
但也在访问 UPDATE WHERE 部分原子和线程安全的字段?此语句是否使用某种悲观 row/table 锁定?
PostgreSQL 没有在服务器端使用线程。
PostgreSQL 不实现 pessimistic/optimistic 行级锁定:由应用程序决定实现悲观或乐观锁定。
PostgreSQL 不会将行级锁升级为 table 锁。