Почему я получаю повторяющиеся ошибки целостности ключа от get_or_create Django?

ОБНОВЛЕНИЕ: нашел здесь ответ, и предлагаемый обходной путь у меня работает: Как справиться с этим состоянием гонки в django?

Привет всем. Обратите внимание на следующий код:

while True:
    User.objects.get_or_create(email='foo-%[email protected]' % int(time()))

Где User - это стандартная модель Django с unique = True для электронной почты. Когда я запускаю этот код в двух оболочках одновременно в течение нескольких секунд, я получаю сообщение об ошибке:

IntegrityError: (1062, "Duplicate entry '[email protected]' for key 'email'")

У меня сложилось впечатление, что get_or_create () был специально разработан, чтобы избежать этой ситуации. Глядя на код, мне кажется, что он должен работать. Сначала он выполняет get (), а затем, если это не удается, вводит транзакцию и пытается сохранить (). Если это не удается, он откатывается и снова пытается получить (). Если это не удается, генерируется исключение из save (), что, похоже, я получаю.

Некоторая полезная информация - я запускаю Django v1.1.0 с MySQL v5.1.39 и InnoDB. Наш уровень изоляции InnoDB - REPEATABLE-READ.

Спасибо за помощь!


person samtregar    schedule 16.12.2010    source источник
comment
Блин, это уродливо. Быстрый конец грязи: используйте общую блокировку до и снимите после операции.   -  person Paulo Scardine    schedule 16.12.2010