2013-05-06 12 views
5

私のトランザクションのいくつかはSERIALIZABLEとして宣言されています。時々、私は40001 serialization_failure40P01 deadlock_detectedのようなクラス40のエラーを返すことがあります(私はまだ他のコードは見ていません)。すべてのクラス40エラーは、シリアル化可能なトランザクションで通常ですか?

マニュアルを正しく理解していれば、これが予想されます。これらのエラーが発生したら、私はトランザクションを再試行すると思います。私の疑いは、であるかどうかです。SERIALIZABLEトランザクションを処理する場合、クラス40エラーのは「正常」です。言い換えれば、クラス40のエラーがトランザクションを再試行する必要があると仮定するか、クラス40のエラーのサブセットに対してのみ正しいと仮定できますか?

+0

あなたはどのバージョンのPostgresを使用していますか? – Kuberchaun

+0

私はPostgreSQL 9.1を使用しています。 Ubuntu 13.04パッケージが利用可能になるとすぐに9.2に更新します。 –

答えて

7

the error codes section of the manual40xxxxSQLSTATEカテゴリは「トランザクションロールバック」です。

それはエラーコードを含む:

  • 40000 transaction_rollback
  • 40002 transaction_integrity_constraint_violation
  • 40001 serialization_failure
  • 40003 statement_completion_unknown
  • 40P01
  • をdeadlock_detected 210

これらのうち、transaction_integrity_constraint_violationが再試行をトリガするとは通常考えられません。これは、DEFERREDの外部キーチェックによってコミットが試みられたときにトランザクションが中止されるときに発生するためです。アプリケーションで並行性とロック設計に問題がない限り、再試行してもこれは解消されません。

私は遭遇していませんstatement_completion_unknown;私はそれを探してお勧めします。

個人的には、私はdeadlock_detectedserialization_failureで再試行します。

+0

返事をありがとう。 40001と40P01のチェックだけが本当に正しいアプローチであるとは思わないでしょう。もっと具体的な答えを探しています... –

+0

@JonSmarkこれらのSQLコードへの参照がドキュメントのどこかに表示されないので、ソースを調べる必要があります。私は今はそうすることができません。他のプロジェクトからの時間要件。 –

1

その間、Kevin Grittnerは私にan unequivocal answerをpgsql-generalメーリングリストで教えてくれました。要約すると、同時の設定で直列化可能なトランザクションを発行すると、エラー40001と40P01の両方が「正常」になります。

関連する問題