我们正在尝试使用以下查询将数据流式传输到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
基本上是“在表中插入记录,如果已经存在->可以根据已经存储在数据库中的数据来选择覆盖某些字段”。
我们希望将此查询挂接到消息队列,并在多个实例中的高并发环境中运行它。使用此查询可能会从不同的连接访问同一行。对我们来说,至关重要的是,只有具有最高交付时间戳记的商品才能最终进入表格
根据文档:
但同时访问UPDATE WHERE部分中原子和线程安全的字段吗?此语句是否使用某种悲观的行/表锁定?
PostgreSQL在服务器端未使用线程。
PostgreSQL未实现悲观/乐观行级别锁定:应用程序有权决定实现悲观或乐观锁定。
PostgreSQL不会将行级锁升级为表锁。