[Seasar-user:3408] Re: トランザクション管理について

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2006年 3月 22日 (水) 00:40:42 JST


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