Проверяет знание SQL, конкуренции транзакций и побочных эффектов UPSERT.
UPSERT может скрывать логические ошибки, приводить к потерянным обновлениям и неожиданным блокировкам при высокой конкуренции.
INSERT ... ON CONFLICT DO UPDATE удобен, но опасен:
сложно отличить insert от update;
возможны race-condition при вычисляемых полях;
update может перезаписать данные, рассчитанные другой транзакцией;
при высокой конкуренции возрастает количество блокировок.
Типичный баг:
два запроса читают старое значение;
оба делают UPSERT;
последнее обновление затирает первое.
Для критичных данных лучше:
явные транзакции;
SELECT FOR UPDATE;
оптимистичная блокировка по версии.
Вывод: UPSERT — не серебряная пуля, особенно в финансовых и счётных системах.