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

sato [E-MAIL ADDRESS DELETED]
2006年 3月 21日 (火) 21:57:06 JST


いつもお世話になっております。
NSQ@佐藤です

トランザクションの管理について教えて下さい

S2DAOを使った場合、コミットはどのタイミングで実行されるのでしょうか?

現在、requiredTxを指定して更新処理を行なう簡単なサンプルを作成して動作さ
せてみているのですが、複数件を同一トランザクションで更新したい所で1件毎
にコミットが実行されてしまう為に処理途中でエラーが発生してもロールバック
する事が出来ません。

単純にdiconファイルの設定に問題があるのかもしれませんが、diconファイルを
色々と変更してみても改善されません。
設定に問題があるようでしたら、指摘して頂けると助かります。


サンプルを実行した際のログは以下のようになります。
------------------------
[main] DEBUG - [トランザクションを開始しました]
[main] DEBUG - [物理的なコネクションを取得しました]
[main] DEBUG - [論理的なコネクションを取得しました]
[main] DEBUG - [論理的なコネクションを閉じました]
[main] DEBUG - [論理的なコネクションを取得しました]
[main] DEBUG - [INSERT INTO TEST (name, id) VALUES ('test1', 1)]
[main] DEBUG - [論理的なコネクションを閉じました]
[main] DEBUG - [トランザクションをコミットしました]
------------------------
[main] DEBUG - [トランザクションを開始しました]
[main] DEBUG - [論理的なコネクションを取得しました]
[main] DEBUG - [INSERT INTO TEST (name, id) VALUES ('test2', 2)]
[main] DEBUG - [論理的なコネクションを閉じました]
[main] DEBUG - [トランザクションをコミットしました]
------------------------
[main] DEBUG - [トランザクションを開始しました]
[main] DEBUG - [論理的なコネクションを取得しました]
[main] DEBUG - [INSERT INTO TEST (name, id) VALUES ('test3', 3)]
[main] DEBUG - [論理的なコネクションを閉じました]
[main] DEBUG - [トランザクションをコミットしました]
------------------------
[main] DEBUG - [トランザクションを開始しました]
[main] DEBUG - [論理的なコネクションを取得しました]
[main] DEBUG - [INSERT INTO TEST (name, id) VALUES ('test4', 1)]
[main] DEBUG - [論理的なコネクションを閉じました]
[main] DEBUG - [トランザクションをロールバックしました]
Exception in thread "main" org.seasar.framework.exception.
SQLRuntimeException: [ESSR0071]SQLで例外が発生しました。
理由はjava.sql.SQLException: ORA-00001: 一意制約 (BOUSAI.PK_TEST) に反し
ています。
・・・・以下省略
------------------------

また、Test.diconの

 <aspect>j2ee.requiredTx</aspect>
 <aspect>dao.interceptor</aspect>

を
<aspect>dao.interceptor</aspect>
<aspect>j2ee.requiredTx</aspect>

のように入れ替えるとトランザクションに関するログすら出力されなくなります。
aspectの指定は記述順によって動作に影響が出るものなのでしょうか?


【動作させたサンプルの情報】

Seaser version
  S2.3.7
  s2-dao-1.0.31

Oracle version
  Oracle 8.1.7

JDK
 1.4

--[Database]------------------------------
CREATE TABLE TEST
(
    ID               NUMBER(3,0) NOT NULL,
    NAME          VARCHAR2(50) NOT NULL,
    CONSTRAINT PK_TEST UNIQUE (ID)
)

--[TestDao.java]------------------------------
package test;

public interface TestDao {
	public Class BEAN = TestBean.class;
	
	public int insert(TestBean tb);
}
--[TestBean.java]------------------------------
package test;
public class TestBean {

	public static final String TABLE = "TEST";
	private int ID;
	private String NAME;

	public int getID() {return ID;}
	public void setID(int id) {ID = id;}
	public String getNAME() {return NAME;	}
	public void setNAME(String name) {NAME = name;	}
}
--[Sample.java]------------------------------
package test;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;

public class Sample{
	
    private static final String PATH = "test/Test.dicon";
	public void run() {
		S2Container container = S2ContainerFactory.create(PATH);
		container.init();
		TestDao dao = (TestDao) container.getComponent(TestDao.
class);
		
		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) {
		Sample sample = new Sample();
		sample.run();
	}
}
--[Test.dicon]------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN" 
	"http://www.seasar.org/dtd/components23.dtd">
<components>
    <include path="dao.dicon"/>

	<component name="TestDao" class="test.TestDao">
	    <aspect>j2ee.requiredTx</aspect>
		<aspect>dao.interceptor</aspect>
	</component>

</components>

--[dao.dicon]------------------------------
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components namespace="dao">
	<include path="j2ee.dicon"/>
	<component
		class="org.seasar.dao.impl.FieldAnnotationReaderFactory"
/>
	<component
		class="org.seasar.dao.impl.DaoMetaDataFactoryImpl"/>
	<component name="interceptor"
		class="org.seasar.dao.interceptors.S2DaoInterceptor"/>
</components>

--[j2ee.dicon]------------------------------
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components namespace="j2ee">
	<component name="transactionManager"
		class="org.seasar.extension.jta.TransactionManagerImpl"
/>
	<component name="requiredTx"
		class="org.seasar.extension.tx.RequiredInterceptor"/>
	<component name="requiresNewTx"
		class="org.seasar.extension.tx.RequiresNewInterceptor"/>
	<component name="mandatoryTx"
		class="org.seasar.extension.tx.MandatoryInterceptor"/>
	<component name="notSupportedTx"
		class="org.seasar.extension.tx.NotSupportedInterceptor"
/>
		
	<component class="org.seasar.extension.jdbc.impl.
BasicResultSetFactory"/>
	<component class="org.seasar.extension.jdbc.impl.
BasicStatementFactory"/>

	<component name="xaDataSource"
		class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
		<property name="driverClassName">
			"oracle.jdbc.driver.OracleDriver"
		</property>
		<property name="URL">
			"jdbc:oracle:thin:@127.0.0.1:1521:test"
		</property>
		<property name="user">"test"</property>
		<property name="password">"test"</property>
	</component>

		<component name="connectionPool"
		class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl
">
		<property name="timeout">600</property>
		<property name="maxPoolSize">10</property>
		<!-- JTAトランザクションが開始されていない場合にコネクシ
ョンを
		     取得できないようにするには次のプロパティをfalseにし
てください.-->
		<property name="allowLocalTx">true</property>
		<destroyMethod name="close"/>
	</component>
	<component name="dataSource"
		class="org.seasar.extension.dbcp.impl.DataSourceImpl"/>
</components>


=========================================================
株式会社 ネットスクエア
   佐藤 慎也 <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 メーリングリストの案内