[Seasar-user:1796] Re: PostgreSQL セッションの分断

加藤太朗 kato
2005年 4月 13日 (水) 12:04:20 JST


小林さん、レスありがとうございます。

暗黙トランザクションの弊害についてのお話は、理解できますし、
言及されていることは私が適切な良い例を出せなかったのが
悪いのですが「たとえばこういうポリシーで構成されていた場合」
という意味であげた、この例が、ふさわしい、ふさわしくない
はともかく、s2で正しく動作する、動作しないに及ぶのは
問題ではないかということなのです。

私が脱線したところが起因しているのですが、まず話を戻させてください。

そもそもトランザクションの話題を振りたいのではなく、
#冒頭で小林さんが別の話題として振ると書いているのに申し訳ないですが
ステートメント単位で保障されている機能が、わざわざ
ステートメント単位に実行されることに戻すために、
トランザクションを有効化しなければならないのはどうか?
ということなんです。

> 二つめとして,そもそもトランザクション境界は DAO によって決められる
> ものではない,ということをあげることができます.
今回の場合ではIDアノテーションの機能が、トランザクション境界
にまで決めてしまっていますよね?

そういう意味では、Daoに依存しているわけではなく、S2Daoに
依存してしまっています。
「回避コード」としてトランザクションを採用することに
なっているところに問題があることを言っています。

暗黙のトランザクションを回避するために、jx.requiredを
インターセプトさせているわけではなく、
ステートメントが連結しないから、jx.requiredを
インターセプトさせているというのは原因と結果が結びついて
いません。

すでにcurrvalはトランザクションが保障しているんではなく、
ステートメントが保障しているという結論になっています。
文単位ではなく、1つ前の文の暗黙トランザクションは
完了しています。
むしろ sequence を使っている現在のS2Daoの実装が危険なので
(こちらは暗黙トランザクションの弊害)"identity"が効くように、
dbms.PostgresqlにBeanMetaDataをインジェクトできる
別のインターフェースアダプタを実装する…というようなことを
S2Daoに独自に手を加えています。
#本当は標準で実装してほしいです。

> > そして「s2daoつかうコードはトランザクションインターセプトで括れ」
> > をやみくもに徹底することになると思います。謎なコーディング規約の
> > ノリで。
> 
> S2Dao を使うかどうかは関係ありません.トランザクション境界の設定は
> サービス層のインタフェースに対して決定すべきものです.謎はありません.

焦点がずれています。サービス層のインタフェースに対して決定するのは
当然です。前述していますが、s2jdbcでは必要ないのに、s2daoを使うことで
「ステートメント単位の連携にトランザクションを使用する謎」のことなんです
が。

> これを徹底するなら,dicon 時代の我らには存在自体が不適切で危険要素といえる
> 暗黙的なトランザクションを使用不可にしてしまうというのも一案ですね.
> 現在の S2DBCP は,JTA のグローバルトランザクションが開始されていなければ
> 暗黙的なトランザクションに設定されたコネクションを返しますが,いっそ
> 例外を吹っ飛ばすというのもありかもしれません.
> # 今更動きを変えると既存の利用者にご迷惑をおかけすることになりかねないので,
> # 本気でそうすべきと考えているわけではありません.
潜在バグを生む不幸より、例外で通知してくれる方が親切だと思いますので、
既存の利用者に迷惑をかけない程度にブロックするのは良いと思います。
暗黙トランザクションは何でもかんでもダメというのは行き過ぎなだけで。
仕込むとしたら多分、S2DBCPレベルではなく、危険要素と類推される文が要求さ
れた時点でカウントし、2つ目の文以降が要求されたら、例外を出す…というぐらい
木目細かであれば、本気で考えても良いと思います。
ただ実際には、Dbmsごとにルールを用意しないとならないので、
ルールデータ(正規表現程度で良いと思いますが)を注入できるクチを
用意しておけば、現実可能ではないかと思います。


--------------------------------------------------------->>
Gluegent,Inc. T.Kato
http://package.gluegent.com/~kato/signature.xml
---->> generate products and services with high added value


> 小林 (koichik) です.
> 
> えと,S2Dao の実装をどうすべきという話とは別件 && 加藤さんに対しての
> レスというより ML を見ている dicon 時代の皆さんへのつぶやきです.
> 
> On Tue, 12 Apr 2005 10:27:40 +0900
> 加藤太朗 <[E-MAIL ADDRESS DELETED]> wrote:
> 
> > いつもトランザクションが必要というのはどうかなと思います。
> > トランザクションが必要なケースとそうでないケースで分けることに
> > していますので。「このケースはロールバックが不要かそうでないか」
> > ということがdicon見てひと目で分かるように…というようなポリシーですが、
> 
> このポリシーには同意しかねます.
> 以下にその理由を.
> 
> まず,トランザクションが「必要なケース」と「そうでないケース」という
> 分け方は不適切だと思います.これは,「明示的なトランザクション」と
> 「暗黙的なトランザクション」に分類すべきではないでしょうか.
> 「暗黙的なトランザクション」は「文単位」のトランザクション境界を持ち,
> 「自動コミット」されるという特性があります.
> 
> 加藤さんはこの二つを使い分けるということですが,私は「暗黙的な
> トランザクション」を積極的に使うべきでないと考えています.
> その理由を以下に二つほど.
> 
> 一つめとして,DAO の存在理由 (メリット) をあげることが出来ます.
> DAO はそもそも,永続化されたデータへのアクセス方法や O/R マッピング
> フレームワーク等を隠蔽するために存在しているはずです.
> しかしながら,ここで「明示的なトランザクション」と「暗黙的な
> トランザクション」を使い分けるということは,DAO がたった一つの
> SQL 文だけを実行するという実装に強く依存するということを意味します.
> # 加藤さんの S2Dao への提案は,このポリシーが DAO の実装に強く
> # 依存していることを如実に示しています.
> これは,dicon 時代に生きる我らにはふさわしくありません.
> DAO の実装ではなく,インタフェースにのみ依存すべきなのです.
> 
> 
> 二つめとして,そもそもトランザクション境界は DAO によって決められる
> ものではない,ということをあげることができます.
> トランザクション境界とは,様々な情報に対して ACID にアクセスしなければ
> ならない一連の作業単位 (Unit of Work) です.
> これは DAO の実装はもちろん,インタフェースとさえも無関係であり,
> サービス層のインタフェースとして表現されるべきものです.
> しかしながら,ここで「明示的なトランザクション」と「暗黙的な
> トランザクション」を使い分けるということは,サービス層の実装が
> (更新のための) DAO を一回だけ呼び出すことと,その DAO の実装が
> たった一つの SQL 文を実行するということに強く依存してしまいます.
> これは,dicon 時代に生きる我らにはふさわしくありません.
> サービス層の実装ではなく,インタフェースにのみ依存すべきなのです.
> 
> > そして「s2daoつかうコードはトランザクションインターセプトで括れ」
> > をやみくもに徹底することになると思います。謎なコーディング規約の
> > ノリで。
> 
> S2Dao を使うかどうかは関係ありません.トランザクション境界の設定は
> サービス層のインタフェースに対して決定すべきものです.謎はありません.
> 
> > 繰り返しになりますが、危険要素を残しておくというのは優れた
> > フレームワークだとは思えないです。
> 
> 同意します.
> これを徹底するなら,dicon 時代の我らには存在自体が不適切で危険要素といえる
> 暗黙的なトランザクションを使用不可にしてしまうというのも一案ですね.
> 現在の S2DBCP は,JTA のグローバルトランザクションが開始されていなければ
> 暗黙的なトランザクションに設定されたコネクションを返しますが,いっそ
> 例外を吹っ飛ばすというのもありかもしれません.
> # 今更動きを変えると既存の利用者にご迷惑をおかけすることになりかねないので,
> # 本気でそうすべきと考えているわけではありません.
> 
> P.S.
> 加藤さんのポリシーに同意しかねる理由として,dicon 時代に
> ふさわしくないという書き方をしましたが,対話型のツールでもない限り
> 暗黙的なトランザクションを原則使うべきでないのは dicon 時代以前から
> 変わっていないと思ってます.
> 
> 
> -- 
> <signature>
>     <name>Koichi Kobayashi</name>
>     <e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
> </signature>
> 
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> http://lists.sourceforge.jp/mailman/listinfo/seasar-user





Seasar-user メーリングリストの案内