1

Postgresを使用するDjango 1.3プロジェクトで、「DatabaseError: current transaction is aborted」(具体的には、841回のうち11回) が発生します。プロジェクトはクイズ サイトであり、ユーザーがビューで回答フォームを送信するとエラーが発生します。データベースの観点から見ると、このプロセスには多くのクエリが含まれており、次のようになります。

  1. 質問に対する正しい答えをすべて集めます (選択式であり、複数の答えが必要な場合があります)*
  2. ユーザーのプロフィールを取得する
  3. この回答を保存
  4. ユーザーの新しいポイント合計のクエリ
  5. 合計をプロフィールに保存する
  6. 新しい報酬の資格があるかどうかを確認する
  7. そうする場合、新しい報酬を授与します

その苦労したプロセスのどこかで、このエラーが発生します (1 つのクエリが他のクエリを待っていないためだと思います)。この場合、本番環境 (つまり、DEBUG = False) でデータベース エラーをログに記録する方法はありますか? WebFaction を使用していますが、Postgres エラー ログを利用できませんこのミドルウェアの例から何かを盗んで、この特定のケースで起動することはできますか?

または、このエラーを見つけるためのより良い方法はありますか、それとも個々のクエリをトランザクションでラップする必要がありますか (残念ながら、それらはすべてコード内の同じ場所にあるわけではありません。ビューをトランザクション デコレータでラップすることが役立つかどうかはわかりません)。

*混乱させるために、複数の正答要件は開発の途中で追加され、ライブの直前に削除されたため、基本的に手順 1 と 4 をスキップして、このプロセスを多少簡略化できましたが、この種の不可解な問題に対する一般的な答え。

4

2 に答える 2

1

トランザクションの自動コミットを有効にする必要があります。DATABASESエントリには、次を含めます。

'OPTIONS': {'autocommit': True,},

デフォルトでは、Django は最初のクエリでトランザクションを開きます。このオプションを使用すると、手動でトランザクションを開始する必要があります (例: を使用@commit_on_success)。開いているトランザクションがなくなったため、以前はトランザクション エラーによってマスクされていた実際のエラーが表示されます。

自動コミット設定は、Django 1.6 の新しいデフォルトになります。https://docs.djangoproject.com/en/dev/ref/databases/#postgresql-notesを参照してください。

于 2013-05-02T09:56:42.427 に答える
1

7 つのステップのどこで開始および終了するトランザクションがあるかを述べていません。それは知っておくと役に立ちます。

「トランザクションが中止されました」メッセージの原因の 1 つは、デッドロックが原因です。詳細は PostgreSQL ログにあります。

しかし、肝心なのは、PostgreSQL のエラー メッセージにアクセスできない場合は、引き続き PostgreSQL のデバッグに苦労し、時間のかかる作業を行うことになります。WebFactionでそれを取り上げてください。それらが役に立たず、あなたの時間に多くの価値がある場合は、この基本的な機能を提供する環境に移行することで、最終的なコストが削減されます.

于 2012-08-02T15:45:09.597 に答える