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