質問

私は比較的シンプルなDjangoアプリを持っていますが、DB操作のかなりの並行性を担当する非常に重い使用法があります。

タグモデルからM2Mを備えたモデル投稿があります。

私のコードの単一行、 p.add(t) MySQLの例外を繰り返し引き起こしています(ここで p ポストインスタンスです t タグインスタンスです。)

IntegrityError: (1062, "Duplicate entry '329051-1827414' for key 'post_id'")

これを上げると、私はこれを手動で実行できます p.add(t) 成功して、DB/APPが通常の実行時にあるという特異な状態に関係する必要があります。それは、私が検出できるパターンなしで、1000個のタグアドディングの試みごとに1回発生します(つまり、「329051-1827414」の両方の数字が変更されます)

a CHECK TABLE 関連するテーブルのMySQLでは、それらがすべて大丈夫であることを示しています。

何か案は?

役に立ちましたか?

解決

通常、追加されている行がFKの一意の制約を複製する場合、中間テーブルに追加しようとすると、そのようなエラーが表示されます。 「329051」を提供した例では、投稿IDであり、「1827414」はタグIDであると推測しています。

通常、Djangoでは、Add()メソッドを繰り返し呼び出して同じインスタンスを追加でき、Djangoはすべての面倒を見てくれます。モデルマネージャーは、各add()が新しい行または既存の行を表すかどうかを判断するのに役立つ状態を維持していると仮定しています。

それ自体は、なぜエラーが発生しているのかを説明していません。あなたは「DB操作におけるかなりの並行性の責任がある」と言及しています。それが何を意味するのか分からずに、複数のスレッド/プロセスが同じ時期に同じ新しいタグを追加しようとしていて、両方がインサートを試みているレース条件を取得できると推測しています。

他のヒント

アプリで同様の問題が見られると思います - M2M関係を追加するために2つの同一のリクエストを送信すると(例:私の場合もタグ)、M2Mテーブルにはユニークな制約があるため、そのエラーが発生します(ユーザー、鬼ごっこ)。サーバーが.ADD関数を処理していると推測しています 同時に.

if not already in database:
   # Both invocations reach here because the next line takes some time to process.
   create m2m row

それがどのように改善できるかわかりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top