[pgsql-jp: 32147] Re: トランザクション中に ERRORが発生するとABORT する

Tietew tietew @ tietew.net
2004年 1月 28日 (水) 13:48:50 JST


On Wed, 28 Jan 2004 13:19:27 +0900
In article <3174A26BBA66B6498A79942C5279D62D0A4B82 @ jptkyxms08.jp.sony.com>
[[pgsql-jp: 32146] Re: トランザクション中に ERRORが発生するとABORT する]
"Ebihara, Yuichiro" <Yuichiro.Ebihara @ jp.sony.com> wrote:

> 指定されて仕方なくOutlook2002を使ってますが、このままでは申し訳ない
> ので、このメールを出したら回避方法が分かるまでしばらく発言を控えよ
> うと思います。このメールだけどうかご容赦下さい。

Outlook というより Exchange の問題でしょう。Outlook 単体で使って
いる場合はスレッドが繋がります。

> さて本題ですが、私はnested transactionのことは考慮していません。
> 
> SQL99の原文(訳も)を見たことはないので私が勘違いしている可能性もあ
> りますが、SAVEPOINTについてはOracleやDB2のようなflat transactionでの
> 実装を想定しています。

Oracle や DB2 のことはよく知らないのですが…

> Oracleだと(たぶんDB2も)SQL文のエラー発生後もトランザクションを継続
> することができます。エラーの原因となった文による変更のみがロールバッ
> クされます(文レベルのロールバック)。

これって正に nested transaction じゃないでしょうか?
要は,一文一文を nested transaction に押し込めてエラーになったト
ランザクションをロールバックする。

PostgreSQL でも auto commit の時(BEGIN を発行していないとき)は 
SQL コマンド一つについて自動的にトランザクションを生成して処理し
ていたと思います。

> その後トランザクションレベルのロールバックを行うか否かは、プログラマ
> の判断次第です。もちろんflat transactionの話です。

というわけで,真の flat transaction ならばエラー即アボートでおか
しくないんじゃないでしょうか。

その代わり(?) LOCK TABLE 〜 IN EXCLUSIVE MODE; を使うと他のセッ
ションからの更新を禁止しつつ MVCC のお陰で読み込みはブロックしな
いので,それをうまく使うということになるでしょう。

nested transaction が使えたからといって,SERIALIZABLE 分離レベル
だと COMMIT でエラーになる可能性もあるので…


―[ Tietew ]――――――――――――――――――――――――――――
Mail: tietew @ tietew.net / tietew @ raug.net
Web : http://www.tietew.net/     Tietew Windows Lab.
PGP fingerprint: 26CB 71BB B595 09C4 0153  81C4 773C 963A D51B 8CAA




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