postgres UPSERT полностью атомарен / потокобезопасен? - PullRequest
0 голосов
/ 28 мая 2020

Мы пытаемся передать данные в 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 блокировку строк / таблиц?

1 Ответ

0 голосов
/ 28 мая 2020

PostgreSQL не использует потоки на стороне сервера.

PostgreSQL не реализует пессимистичный / оптимистичный c блокировку на уровне строк: решение о реализации пессимистического режима остается за приложением c или optimisti c блокировка.

PostgreSQL не переводит блокировки на уровне строк в блокировку таблицы.

...