2010-10-05 3 views
1

У меня есть относительно простое приложение Django с довольно интенсивным использованием, которое отвечает за довольно некоторый параллелизм в операциях db.IntegrityError с отношениями Django m2m

У меня есть модель Post с m2m для модели тегов.

Одна линия в моем коде, p.add(t) неоднократно вызывая исключения MySQL (где p является экземпляром Post и t является экземпляром Tag.)

IntegrityError: (1062, "Duplicate entry '329051-1827414' for key 'post_id'") 

Когда поднимается, я могу вручную запустить этот p.add(t) успешно , поэтому он должен иметь отношение к некоторому своеобразному состоянию, в котором db/app находится во время обычного выполнения. Это происходит примерно каждые 1000 попыток добавления тегов, без какого-либо шаблона, который я могу обнаружить (т.е. оба числа в паре «329051-1827414» примера смены)

CHECK TABLECHECK TABLE в соответствующей таблице показывает, что они все вроде бы ОК.

Любые идеи?

ответ

1

Обычно вы пытаетесь добавить к промежуточной таблице ошибки, если добавляемая строка дублирует ограничение уникальности для FK. Я предполагаю, что в примере, который вы предоставили «329051», есть идентификатор Post, а «1827414» - идентификатор тега.

Обычно в Django вы можете повторно вызвать метод add(), чтобы добавить тот же экземпляр, и Django позаботится обо всем для вас. Я предполагаю, что диспетчер модели поддерживает некоторое состояние, чтобы помочь ему определить, будет ли каждый add() представлять новую или существующую строку, и если строка выглядит новой, она пытается вставить.

Это само по себе не объясняет, почему вы получаете ошибку. Вы упомянули, что «отвечает за довольно некоторый параллелизм в операциях db». Не зная, что это значит, я предполагаю, что вы можете получить условие гонки, когда несколько потоков/процессов пытаются добавить один и тот же новый тег в одно и то же время, и оба пытаются вставить.

0

Я думаю, что у меня есть аналогичная проблема в моем приложении. Если я отправлю два идентичных запроса, чтобы добавить отношение m2m (например, тег в моем случае), я получаю эту ошибку, потому что таблица m2m имеет уникальное ограничение on (пользователь, тег). Я предполагаю, что сервер обрабатывает функции .add в то же время.

if not already in database: 
    # Both invocations reach here because the next line takes some time to process. 
    create m2m row 

Я не знаю, как это можно исправить.

Смежные вопросы