[Seasar-user:3416] Re: トランザクション管理について
sato
[E-MAIL ADDRESS DELETED]
2006年 3月 22日 (水) 19:16:13 JST
NSQ@佐藤です
小林 (koichik) さん
ありがとうございます
ご指摘の通りに修正したら期待通りの動作となりました
トランザクションはj2ee.requiredTxを指定したpointcut毎に管理されるのです
ね。やっとトランザクションの指定が解ったような気がします。
<aspect>の順序も気をつけて指定するようにします。
>小林 (koichik) です.
>
>Date: Tue, 21 Mar 2006 21:57:06 +0900
>From: sato <[E-MAIL ADDRESS DELETED]>
>To: [E-MAIL ADDRESS DELETED]
>Subject: [Seasar-user:3406] トランザクション管理について
>
>> 現在、requiredTxを指定して更新処理を行なう簡単なサンプルを作成して動作さ
>> せてみているのですが、複数件を同一トランザクションで更新したい所で1件毎
>> にコミットが実行されてしまう為に処理途中でエラーが発生してもロールバック
>> する事が出来ません。
>
>DAO にトランザクションのインターセプタを設定しているため,
>DAO のメソッドを呼び出す毎にトランザクションがコミット
>されています.
>
>DAO そのものではなく,それを呼び出すメソッドに
>インターセプタを設定してください.
>例えば Sample クラスを
>
>public class Sample {
> private static final String PATH = "test/Test.dicon";
>
> private TestDao dao;
> public void setTestDao(TestDao dao) {
> this.dao = dao;
> }
>
> public void run() {
> TestBean tb1 = new TestBean();
> System.out.println("------------------------");
> tb1.setID(1);
> tb1.setNAME("test1");
> dao.insert(tb1);
> System.out.println("------------------------");
> TestBean tb2 = new TestBean();
> tb2.setID(2);
> tb2.setNAME("test2");
> dao.insert(tb2);
> System.out.println("------------------------");
> TestBean tb3 = new TestBean();
> tb3.setID(1);
> tb3.setNAME("test3");
> dao.insert(tb3);
> }
>
> public static void main(String[] args) {
> S2Container container = S2ContainerFactory.create(PATH);
> container.init();
> Sample sample = (Sample) container.getComponent("Sample");
> sample.run();
> }
>}
>
>のように修正して,test.dicon を
>
>
> <component name="TestDao" class="test.TestDao">
> <aspect>dao.interceptor</aspect>
> </component>
> <component name="Sample" class="test.Sample">
> <aspect pointcut="run">j2ee.requiredTx</aspect>
> </component>
>
>のようにしてください.
>Sample クラスの run() メソッドにトランザクション
>境界が設定されます.
># 上のコードおよび dicon はメーラ上でこぴぺ&修正
># したものなので不備があるかもしれませんがご容赦
>
>
>> また、Test.diconの
>>
>> <aspect>j2ee.requiredTx</aspect>
>> <aspect>dao.interceptor</aspect>
>>
>> を
>> <aspect>dao.interceptor</aspect>
>> <aspect>j2ee.requiredTx</aspect>
>>
>> のように入れ替えるとトランザクションに関するログすら出力されなくなります。
>> aspectの指定は記述順によって動作に影響が出るものなのでしょうか?
>
>はい.
>インターセプタは <aspect> 要素に記述した順で実行されます.
>そして dao.interceptor は (基本的に) 後続のインターセプタを
>呼び出しません.
>そのため,dao.interceptor を先に記述すると j2ee.requiredTx が
>呼び出されないため,トランザクションのログも出力されなく
>なります.
>というか,JTA トランザクションが開始されなくなります.
>
>
>--
><signature>
> <name>Koichi Kobayashi</name>
> <e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
></signature>
>
>_______________________________________________
>Seasar-user mailing list
>[E-MAIL ADDRESS DELETED]
>https://www.seasar.org/mailman/listinfo/seasar-user
=========================================================
株式会社 ネットスクエア
佐藤 慎也 <E-mail:[E-MAIL ADDRESS DELETED]>
〒733-0822
広島市西区庚午中4丁目6−1セントラルビル3F
http://www.net-squares.com/
TEL:(082) 507 - 6266
FAX:(082) 507 - 6267
=======================================================
<< ISO文書管理は弊社のISO-SQUAREにお任せ下さい。 >>
=======================================================
Seasar-user メーリングリストの案内