Многопоточность и ERROR: duplicate key value violates unique constraint

lemur489
Дата: 07.04.2015 17:37:47
Всем привет.

Довольно-таки давно в проект закралась проблема.
Несколько потоков(20) импортируют данные(1000+ объектов) и в случае если объект существует в базе обновляет, если нет - создаёт.
Но иногда выдаёт ошибку
SQL Error: 0, SQLState: 23505
ERROR JDBCExceptionReporter:234 - ERROR: duplicate key value violates unique constraint "some_key"

Главная проблема, что это происходит иногда и на абсолютно случайных объектах, без какой либо закономерности.

Нашел некоторые упоминания на англоязычных форумах, но там темы так и остались без ответа.
Предпологаю, что проблема именно в многопоточности.
Кто-нибудь сталкивался с чем-нибудь похожим?
Версия Postgres 9.1.

Заранее благодарю!
p2.
Дата: 07.04.2015 17:59:25
lemur489,

поскольку в постресе нет мерджа, предположу, что используются два оператора в реад-комиттед.
типичная ошибка разработчиков, далеких от понимания транзакционной модели работы с данными.
vyegorov
Дата: 07.04.2015 18:01:23
lemur489,

Поток 1: Есть ли объект 100? — “нет”
Поток 1: <приступил к созданию>
Поток 2: Есть ли объект 100? — “нет” (пока нет)
Поток 2: <приступил к созданию>
Поток 1: COMMIT; — все хорошо, создали объект 100
Поток 2: COMMIT; — ERROR: duplicate key value violates unique constraint "some_key"

Тут хорошо расписано.
Dimitry Sibiryakov
Дата: 08.04.2015 14:07:13
Вот только непонятно почему они с таким маниакальным упорством делают UPDATE первым запросом. Всё же проще: попытались сделать INSERT - обломились по нарушению уникальности - сделали UPDATE. Профит.
Ivan Durak
Дата: 08.04.2015 14:16:32
Dimitry Sibiryakov
Вот только непонятно почему они с таким маниакальным упорством делают UPDATE первым запросом. Всё же проще: попытались сделать INSERT - обломились по нарушению уникальности - сделали UPDATE. Профит.

а если не обломились - апдейтить потом то что инсертнули?
Dimitry Sibiryakov
Дата: 09.04.2015 13:50:48
Ivan Durak
а если не обломились - апдейтить потом то что инсертнули?

Зачем его апдейтить?