スレッド化されたアプリケーション+ IntegrityError
-
06-07-2019 - |
質問
PythonスレッドアプリケーションとPostgresがあります。 DjangoのORMを使用しています
Postgresに保存します。
同時保存呼び出しがあります。時々2つのスレッドが保存されます
問題につながる同じ主キー。
Postgresログ:
エラー:キー値の重複が一意の制約" store_pkey"
に違反しています
文:「ストア」に挿入します; (" store_id"、" address")値
(E'HAN277 '、E'101 Ocean Street')
コード:
コードにはIntegrityErrorが表示されます。さまざまな方法を試しました
この。
a。
try:
a.save()
IntegrityError:
を除く
パス
これによりInternalErrorが発生します
b。トランザクションのロールバックを試みました..しかし確かではありません。 トランザクションを持つためには、保存呼び出しを区別する必要があることを理解してください
sid = transaction.savepoint()
try:
row.save()
except IntegrityError, e:
transaction.savepoint_rollback(sid)
pass
transaction.commit()
最初のセーブポイントは次のエラーで失敗します
AttributeError: 'NoneType'オブジェクトには属性 'cursor'がありません
a。 djangoは100%スレッドセーフではありません。いいですか
私のユースケースでの選択。私はすでに他のアプリケーションにDjangoを使用していました
ORMが必要です。だから当然Djangoを選択しました
b。この状況に対処する方法..コメント。
ありがとうございます。 ラミア
解決
念のため、正しく理解できれば主キーに文字列を使用していますか?
AttributeError: 'NoneType'オブジェクトには属性 'cursor'がありません
これは、一部のPythonコードにエラーがあることを意味します。 Djangoの別のバージョンまたはリビジョンを使用したり、バグをDjango tracで検索したりしましたか?トランクのバージョンを使用している場合、何らかのバグの影響を受けることは珍しくありません。
選択肢として、複数のスレッドの代わりに複数のプロセスを使用してDjangoをデプロイすることもできます。
ただし、他のバグが発見される可能性があるため、リクエストが重複している理由を確認したい場合があります。