質問

(PostgreSQLの下で)アプリケーションをデバッグしようとしていますが、次のエラーが発生しました。 "現在のトランザクションは中止され、コマンドは無視されます"。

「トランザクション」を理解できる限り、基礎となるデータベース接続に関連する概念です。

接続に自動コミット「false」がある場合、失敗しない限り、同じステートメントを介してクエリを実行できます。その場合、ロールバックする必要があります。

自動コミットが" true"の場合すべてのクエリがアトミックであると見なされる限り、問題ではありません。

自動コミットfalseを使用すると、単純な場合でもPostgreSQLで前述のエラーが発生します

select * from foo

失敗します。これにより、SQLException(s)は" transaction"になります。無効とみなされ、ロールバックするか、別のクエリに使用しないでください

  

MacOS 10.5、Java 1.5.0_16、JDBCドライバー8.1-407.jdbc3を備えたPostgreSQL 8.3を使用

役に立ちましたか?

解決

このエラーは、トランザクションで送信されたクエリの1つが失敗したことを意味するため、残りのクエリは現在のトランザクションが終了するまで無視されます(自動的にロールバックになります)。 PostgreSQLへのトランザクションは失敗し、1つの例外を除いてエラーが発生した後、どのような場合でもロールバックされます。適切な対策を講じる必要があります。

  1. ステートメントを破棄し、新たに始めます。
  2. トランザクションで SAVEPOINT を使用できるようにするその時点に戻って別のパスを試してください。 (これは例外です)

クエリログを有効にして、どのクエリが失敗したかを確認します。そしてその理由。

いずれの場合でも、質問に対する正確な答えは、SQLExceptionはトランザクション終了コマンドが送信されたとき、つまりCOMMITまたはROLLBACK(またはEND)が発行されたときにロールバックが発生したことを意味するということです。これがどのように機能するかです。セーブポイントを使用しても同じルールに縛られている場合は、保存した場所に戻って他のことを試すことができます。

他のヒント

他のほとんどのDBMSで共有されていないPostgreSQLの特徴的な動作のようです。一般に(PostgreSQLの外部で)、エラーのために1つの操作が失敗する可能性があります。その後、同じトランザクションで、成功する代替アクションを試行して、エラーを補正できます。 1つの例:マージ(挿入/更新)操作を検討します。新しいレコードを挿入しようとしても、すでに存在していることがわかった場合は、代わりに既存のレコードを変更するUPDATE操作に切り替えることができます。これは、すべてのメインDBMSで正常に機能します。 PostgreSQLで機能しないことは確かではありませんが、この質問と同様に、他の場所で見た説明では、INSERTを試行すると、トランザクション内のそれ以上のアクティビティも失敗する運命にあることを示唆しています。これはせいぜい厳しい条件で、最悪の場合は「使用不可能」です。

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