2

更新:ここで答えが見つかりました。提案された回避策は私のために機能します: django でこの競合状態に対処するにはどうすればよいですか?

皆さんこんにちは。次のコードを確認してください。

while True:
    User.objects.get_or_create(email='foo-%d@example.com' % int(time()))

User は、電子メールに対して unique=True を指定した標準の Django モデルです。このコードを 2 つのシェルで同時に数秒以内に実行すると、次のようなエラーが表示されます。

IntegrityError: (1062, "Duplicate entry 'foo-1292519049@example.com' for key 'email'")

get_or_create() は、この状況を回避するために特別に設計されたというのが私の印象でした。コードを見ると、それが機能しているように思えます。最初に get() を実行し、それが失敗した場合はトランザクションに入り、save() を試行します。それが失敗した場合、ロールバックして get() を再試行します。それが失敗した場合、save() からの例外がスローされます。これは、私が得ているようです。

役立つ情報 - MySQL v5.1.39 と InnoDB で Django v1.1.0 を実行しています。当社の InnoDB 分離レベルは REPEATABLE-READ です。

助けてくれてありがとう!

4

0 に答える 0