Мы пытаемся передать данные в 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 гарантирует atomi c INSERT или UPDATE результат; при отсутствии независимой ошибки один из этих двух результатов гарантирован даже при высоком уровне параллелизма.
, но также осуществляется доступ к полям в UPDATE WHERE part atomi c и потокобезопасен? Использует ли этот оператор какую-то пессимистичную c блокировку строк / таблиц?