1

私は比較的単純な Django アプリを持っていますが、db 操作でかなりの同時実行を担当する非常に重い使用法があります。

タグモデルへのm2mを備えたモデル投稿があります。

コード内の 1 行p.add(t)が繰り返し mysql 例外を引き起こしています (pは Post インスタンスで、tは Tag インスタンスです)。

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

これが発生すると、これを手動でp.add(t)正常に実行できるため、通常の実行時に db/app が特定の状態にあることに関係している必要があります。1000回のタグ追加試行ごとに約1回発生しますが、検出できるパターンはありません(つまり、例の「329051-1827414」ペアの両方の数字が変化します)

関連するテーブルのmysqlのACHECK TABLEは、それらがすべて一見OKであることを示しています。

何か案は?

4

2 に答える 2

1

通常、追加される行がFKのunique-together制約と重複する場合、中間テーブルに追加しようとすると、このようなエラーが発生します。あなたが提供した例では、「329051」は投稿IDであり、「1827414」はタグIDであると推測しています。

通常、Djangoでは、add()メソッドを繰り返し呼び出して同じインスタンスを追加でき、Djangoがすべてを処理します。モデルマネージャーは、各add()が新しい行を表すか既存の行を表すかを判断するのに役立つ状態を維持し、行が新しいように見える場合は挿入を試みると想定しています。

それ自体は、エラーが発生する理由を説明していません。あなたは「db操作でかなりの同時実行性に責任がある」と述べています。それが何を意味するのかわからないので、複数のスレッド/プロセスが同じ時間に同じ新しいタグを追加しようとし、両方が挿入を試みているという競合状態になる可能性があると思います。

于 2010-10-05T21:51:42.903 に答える
0

私のアプリでも同様の問題が発生していると思います - m2m リレーション (例: 私の場合もタグ) を追加するために 2 つの同一のリクエストを送信すると、m2m テーブルには (user,鬼ごっこ)。サーバーが .add 関数を同時に処理していると思います。

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

どうすれば治るかわかりません。

于 2014-05-30T01:34:27.087 に答える