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

Hiroshi Inoue inoue @ tpf.co.jp
2010年 9月 9日 (木) 12:32:41 JST


井上です。
既に検証されたようですが、補足します。

(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 メーリングリストの案内