3

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

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

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

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

auto commit falseを使用すると、単純な場合でもPostgreSQLで前述のエラーが発生します

select * from foo

どの SQLException(s) が「トランザクション」が無効と見なされ、ロールバックするか、別のクエリに使用しないでください。

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

4

2 に答える 2

5

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

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

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

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

于 2008-10-12T11:48:06.213 に答える
2

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

于 2008-10-12T14:27:23.630 に答える