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

Koichi Kobayashi koichik
2005年 4月 13日 (水) 03:16:01 JST


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