Мы сталкиваемся с известной проблемой в django:
IntegrityError во многих случаях добавить()
Существует условие гонки, если несколько процессов/запросов пытаются добавить одну и ту же строку в ManyToManyRelation.
Как обойти это?
Envionment:
- Django 1.9
- Сервер Linux
- Postgres 9.3 (при необходимости можно сделать обновление)
Подробнее
Как воспроизвести его:
my_user.groups.add(foo_group)
Выше сбой, если два запроса попытаются выполнить этот код сразу. Вот таблица базы данных и ограничение на отказ:
myapp_egs_d=> \d auth_user_groups
id | integer | not null default ...
user_id | integer | not null
group_id | integer | not null
Indexes:
"auth_user_groups_pkey" PRIMARY KEY, btree (id)
fails ==> "auth_user_groups_user_id_group_id_key" UNIQUE CONSTRAINT,
btree (user_id, group_id)
Окружающая среда
Так как это происходит только на производственных машинах, и все производственные машины в моем контексте запускают postgres, будет доступно только решение postgres.