[pgsql-jp: 40374] Re: ODBCドライバの設定についてわかりません

toshihideka4316 @ zenrin.co.jp toshihideka4316 @ zenrin.co.jp
2010年 9月 9日 (木) 15:38:11 JST


片山です。
ご回答ありがとうございます。
以下のように理解いたしました。

ODBC接続文字列に以下の設定文字列を追加することで、エラー時のロールバック処理
の動作設定を行うことが出来る。
↓
protocol=7.4-X
x=0 or 1 or 2(デフォルトでは2と同じ動きをする)

設定7.4-0の場合:「エラー時のロールバックなし」
エラー発生時にロールバックを行わない。
ロールバックを行わない為、そのままではエラー発生後INSERT文を発行してもレコー
ドは挿入されない。

設定7.4-1の場合:「エラー時全キャンセル」
エラー発生時にロールバックを行い、トランザクションの内容をキャンセルする。
ロールバック後に発行されたエラー発生後INSERT文についてはレコードが挿入され
る。

設定7.4-2の場合:「文単位ロールバック」
INSERTごとにSAVEPOINTを発行する。
エラー時に発行したSAVEPOINTを頼りに、エラー処理の直前までロールバックを行う。


以上です。
> -----Original Message-----
> From: pgsql-jp-bounces @ ml.postgresql.jp 
> [mailto:pgsql-jp-bounces @ ml.postgresql.jp] On Behalf Of Hiroshi Inoue
> Sent: Thursday, September 09, 2010 12:33 PM
> To: pgsql-jp @ ml.postgresql.jp
> Subject: [pgsql-jp: 40373] Re: ODBCドライバの設定についてわかりません
> 
> 井上です。
> 既に検証されたようですが、補足します。
> 
> (2010/09/08 15:42), toshihideka4316 @ zenrin.co.jp wrote:
> >   片山です。
> > 
> > 井上さん、ご回答ありがとうございます。
> > 文単位のロールバック処理オプションについては理解することができ、こちらで
も動
> > 作を確認することが出来ました。
> > 
> > さて、残るオプションの「無し」と「全キャンセル」の違いがいまいちわかりま
せ
> > ん。
> > よろしければ教えていただけないでしょうか。
> 
> エラー時のロールバック発行というオプションは、8.0でsavepointが導入
> されるまではなかったオプションであり、それ以前は「全キャンセル」の
> 動作をしていました。savepoint導入以前のPostgreSQLでは、DB操作で何ら
> かのエラーが発生した場合ROLLBACK(又はCOMMIT)を発行する以外に処理を
> 継続する方法がなかったので、ユーザーの手間を省いてドライバ側で親切
> (勝手?)にROLLBACKを発行するのが「全キャンセル」の動作です。いさ
> さかお節介が過ぎる所はあるのですが、ユーザー側はトランザクション終
> 了処理を省略することが出来ます。しかしこの動作では、エラーの発生時
> に折角のsavepoint機能を利用することができないため、オプションとして
> 追加されたのが「無し」及び「文単位」です。
> 
> 「無し」オプションでエラーが発生した場合、あらかじめユーザーが設定して
> おいたsavepointにROLLBACKするか全キャンセルするかをユーザーが判断して
> 処理することが出来ます。
> 「文単位」オプションはsavepointの一つの使用法をユーザーに意識させず
> 使ってもらうためのオプションです。実は「無し」と同様にユーザーが設定
> したsavepointを利用することも可能で柔軟性は十分なのですが、どうして
> もパフォーマンスが落ちてしまうのが難点といえます。
> 
> > こちらで動作検証しましたところ、「無し」と「全キャンセル」オプションは同
じ働
> > きをしているように見えます。
> > 
> >> 1.複数レコードのInsert途中にクライアントのプロセスを強制終了
> > 無し⇒insertなし
> > 全キャンセル⇒insertなし
> 
> どのようなオプションを選択してもこの場合の結果は変わりません。
> 
> >> 2.ユニークインデックス違反になるようなレコードの挿入
> > 無し、全キャンセル⇒どちらもエラー後にcommitした場合、データのinsertなし
> 
> 「無し」の場合、トランザクション終了処理を行わずsavepoint(存在すれば)
> にROLLBACKした後、新たなコマンド実行を継続することが可能です。なお
> savepointが存在しない場合はユーザーがトランザクション終了処理を行わ
> ない限り新たなコマンドは実行出来ません。
> 「全キャンセル」の場合、既にROLLBACKが発行されているため、commitしても
> しなくても結果は変わりません。savepointは設定されていたとしても消えて
> しまっています。
> 
> > 以上よろしくお願いいたします。
> 
> 
> 
> 




pgsql-jp メーリングリストの案内