Почему я получаю повторяющиеся ошибки целостности ключа из get_or_create Джанго? - PullRequest
2 голосов
/ 16 декабря 2010

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

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

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.

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

...