ОБНОВЛЕНИЕ: нашел здесь ответ, и предлагаемый обходной путь у меня работает: Как справиться с этим состоянием гонки в 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.
Спасибо за помощь!