ОБНОВЛЕНИЕ: Нашел ответ здесь, и предлагаемый обходной путь работает для меня: Как мне справиться с этим условием гонки в Джанго?
Привет всем. Соблюдайте следующий код:
while True:
User.objects.get_or_create(email='foo-%d@example.com' % int(time()))
Где пользователь - стандартная модель Django с уникальным = True для электронной почты. Когда я запускаю этот код в двух оболочках одновременно в течение нескольких секунд, я получаю сообщение об ошибке:
IntegrityError: (1062, "Duplicate entry 'foo-1292519049@example.com' for key 'email'")
У меня сложилось впечатление, что get_or_create () был специально разработан, чтобы избежать этой ситуации. Глядя на код, мне кажется, что он должен работать. Сначала он выполняет get (), затем, если это не удается, вводит транзакцию и пытается сохранить (). Если это не удается, он откатывается и снова пытается получить get (). Если это не удается, генерируется исключение из save (), что, похоже, и есть то, что я получаю.
Немного полезной информации - я использую Django v1.1.0 с MySQL v5.1.39 и InnoDB. Наш уровень изоляции InnoDB - REPEATABLE-READ.
Спасибо за помощь!