[Seasar-user:8082] Re: [Seasar]Seasar2.4系でトランザクションを扱うための設定

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2007年 6月 5日 (火) 19:00:23 JST


小林 (koichik) です.

Date:    Tue, 05 Jun 2007 18:00:28 +0900
From:    kondo <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:8081] Re: [Seasar]Seasar2.4系でトランザクションを扱うための設定

> 「設定すべき」との事ですが、よろしければ御意見を頂けないでしょうか?
> 私の認識では、"トランザクションは更新処理に対して"というイメージがある
> 為、更新系のメソッドに対してのみかけるものだと思っています。
> ※DBでいうところの"トランザクション"のイメージです。

DB でいうところのトランザクションも,決して
更新処理専用ではないですし,commit が保存 (save) を
意味するものでもありません.
多くの場合,照会系では気にしなくても問題に
ならないことがほとんどというだけですね.

しかし,phantom read を回避する必要があり,
トランザクション分離レベルを serializable に
設定するとなると,照会系でもトランザクション
境界を適切に設定する必要が出てきます.

phantom read というのは最初の SELECT を
実行した時点では存在しなかった行が,その後の
SELECT で見えてしまうというもので,

TxA                           TxB

select * from emp
                               insert into emp values (...)
                               commit
select * from emp


のようなケースですね.
ここで TxA の二つの SELECT が一貫した状態の
テーブルを参照しなければならない場合 (集計などで
整合性が必要な場合とか) には,二つの SELECT の
前後にトランザクション境界を設定し,分離レベルを
serializable にするといった必要があります.

通常は phantom read や unrepeatable read が
問題にならないことが多いものの,それでも
トランザクション境界は明確にしておくのが
よいマナーだと考えます.
# 分離レベルはデフォルトのcommitted read で.

詳細は「トランザクション」「ACID」「分離レベル」
「phantom read」「unrepeatable read」等で検索など
してみてください.
書籍としては

「トランザクション処理システム入門」
http://www.amazon.co.jp/dp/4822280268/

あたりが比較的手頃なボリュームで十分な
説明があってオススメです.
もっと追求するならジム・グレイ氏の大著を (笑).

「トランザクション処理〈上〉―概念と技法」
http://www.amazon.co.jp/dp/4822281027/
「トランザクション処理〈下〉―概念と技法」
http://www.amazon.co.jp/dp/4822281035/


> 私の方で開発しておりますLogicクラスには、対DB用のread,insert,update,
> deleteの他にも、複雑な計算処理等はLogicクラスに実装しようと思っており
> ましたので、そういったものにまでトランザクションが反応させなくても
> いいのではないかと思っておりますので、部分的な対応にしようとしています。

S2 の場合,トランザクションを開始するコストは
極めて小さく,全く DB にアクセスしない場合でも
トランザクションを開始して問題ないと思います.
ただ,「計算処理」にトランザクションを設定するのは
あまり気持ちのいいものではないですね.

そんなわけで (どんなわけで?),Service を用意して
そこにトランザクション境界を設定するのが
Easy Enterprise 的にはオススメです.

が,そんなにレイヤを増やしたくない場合は Logic に
トランザクション境界を設定して,ポイントカットで
メソッドを選択するのもアリじゃないでしょうか.


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>




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