3

postgres 9.3-1100-jdbc41 JDBC4 ドライバーを使用してバッチ挿入を行っています。

JDBC 仕様によると、自動コミットを無効にし、トランザクションをコミットまたはロールバックするのはアプリケーション次第です。

私の場合、トランザクションを使用していません (つまり、自動コミットが true です) が、バッチ内の挿入の 1 つが失敗すると、挿入はロールバックされます。

JDBC 仕様によると、「バッチ更新のコマンドの 1 つが正しく実行されなかった場合、このメソッドは BatchUpdateException をスローし、JDBC ドライバーはバッチ内の残りのコマンドの処理を続行する場合としない場合があります。」ここでは、以前に実行されたコマンドがロールバックされるとは言いません。

私の理解は間違っていますか?そうでない場合、ドライバーがこのように動作している理由と、そうである場合、仕様に従った正しい動作は何ですか。

4

1 に答える 1

1

私が知る限り、仕様は基本的にこれをドライバーに任せています。バッチが失敗した場合に、既に処理された作業がコミットされるかどうかは指定されません。

PgJDBC はトランザクションでバッチを実行するため、バッチの一部が失敗すると、すべてが中止されます。

この動作が正しくないと思われる場合は、最初に、他のドライバーが一貫して PgJDBC とは異なる方法で動作することを示すテスト ケースを作成し、それをPgJDBC issue trackerに送信する必要があります。他のドライバーの動作を調査する時間はありません。そのため、テスト ケースを作成し、他の一般的なデータベース (MS SQL Server、Oracle、DB2、MySQL など) で実行するか、他のユーザーが実行するように手配する必要があります。PgJDBC の動作が他のドライバーのバッチの処理方法と異なることを示した場合は、動作を変更するオプションを追加することを検討する価値があります (そして最終的にはそれをデフォルトにする作業を行います)。

于 2015-04-07T07:35:57.293 に答える