[Seasar-user:8400] トランザクション管理について-その2

yt [E-MAIL ADDRESS DELETED]
2007年 6月 18日 (月) 14:54:48 JST


Seasar初心者ですが、どうぞよろしくお願いします。

トランザクションを学習しようと、
このMLの
[Seasar-user:3406]トランザクション管理について
http://ml.seasar.org/archives/seasar-user/2006-March/005320.html

を参考に、サンプルを作成しました。

3回INSERT処理を発行していますが、どれもCOMMITされず、
テーブルにデータはできない事を期待しましたが、
結果は、1回目と2回目のINSERTがコミットされていました。。。

サンプルを実行した際のログは下記です。
ログはロールバックされている感じです。

--[コンソール]------------------------------
[2007/6/18 14:33:06, 286] <<DEBUG>> [main] [org.seasar.framework.log.Logger] [トランザクションを開始しました] 
------------------------
[2007/6/18 14:33:06, 723] <<DEBUG>> [main] [org.seasar.framework.log.Logger] [物理的なコネクションを取得しました] 
[2007/6/18 14:33:06, 739] <<DEBUG>> [main] [org.seasar.framework.log.Logger] [論理的なコネクションを取得しました] 
[2007/6/18 14:33:06, 770] <<DEBUG>> [main] [org.seasar.framework.log.Logger] [論理的なコネクションを閉じました] 
[2007/6/18 14:33:06, 770] <<DEBUG>> [main] [org.seasar.framework.log.Logger] [論理的なコネクションを取得しました] 
[2007/6/18 14:33:06, 786] <<DEBUG>> [main] [org.seasar.framework.log.Logger] [物理的なコネクションを取得しました] 
[2007/6/18 14:33:06, 786] <<DEBUG>> [main] [org.seasar.framework.log.Logger] [論理的なコネクションを取得しました] 
[2007/6/18 14:33:06, 786] <<DEBUG>> [main] [org.seasar.framework.log.Logger] [論理的なコネクションを閉じました] 
[2007/6/18 14:33:07, 004] <<DEBUG>> [main] [org.seasar.framework.log.Logger] [論理的なコネクションを閉じました] 
[2007/6/18 14:33:07, 020] <<DEBUG>> [main] [org.seasar.framework.log.Logger] [論理的なコネクションを取得しました] 
[2007/6/18 14:33:07, 020] <<DEBUG>> [main] [org.seasar.framework.log.Logger] [INSERT INTO TEST (name, id) VALUES ('test1', 1)] org.seasar.framework.log.Logger.debug(Logger.java:58)

[2007/6/18 14:33:07, 036] <<DEBUG>> [main] [org.seasar.framework.log.Logger] [論理的なコネクションを閉じました] 
------------------------
[2007/6/18 14:33:07, 051] <<DEBUG>> [main] [org.seasar.framework.log.Logger] [論理的なコネクションを取得しました] 
[2007/6/18 14:33:07, 051] <<DEBUG>> [main] [org.seasar.framework.log.Logger] [INSERT INTO TEST (name, id) VALUES ('test2', 2)] org.seasar.framework.log.Logger.debug(Logger.java:58)

[2007/6/18 14:33:07, 051] <<DEBUG>> [main] [org.seasar.framework.log.Logger] [論理的なコネクションを閉じました] 
------------------------
[2007/6/18 14:33:07, 051] <<DEBUG>> [main] [org.seasar.framework.log.Logger] [論理的なコネクションを取得しました] 
[2007/6/18 14:33:07, 051] <<DEBUG>> [main] [org.seasar.framework.log.Logger] [INSERT INTO TEST (name, id) VALUES ('test3', 1)] org.seasar.framework.log.Logger.debug(Logger.java:58)
[2007/6/18 14:33:07, 098] <<DEBUG>> [main] [org.seasar.framework.log.Logger] [論理的なコネクションを閉じました] 
[2007/6/18 14:33:07, 114] <<DEBUG>> [main] [org.seasar.framework.log.Logger] [トランザクションをロールバックしました] 


きちんとロールバックがかかるように修正したいのですが
いきづまってしまいました。
何か設定に不備があれば、ご指摘下さい。
どうぞ、よろしくお願いします

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

Seaser version
  S2.4.13
  s2-dao-1.0.43

derby version
  derby 10.2.1.6

JDK
 jdk1.5.0_12

--[Database]------------------------------
CREATE TABLE TEST(
ID SMALLINT NOT NULL,
NAME VARCHAR(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";

	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]------------------------------
<?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"/>
    <include path="j2ee.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>

</components>

--[dao.dicon]------------------------------
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
	"http://www.seasar.org/dtd/components21.dtd">
<components namespace="dao">
	<include path="jdbc.dicon"/>
	<component class="org.seasar.dao.impl.AnnotationReaderFactoryImpl"/>
	<component class="org.seasar.dao.impl.DaoMetaDataFactoryImpl"/>
	<component
		name="interceptor"
		class="org.seasar.dao.pager.PagerS2DaoInterceptorWrapper">
		<arg>
			<component class="org.seasar.dao.interceptors.S2DaoInterceptor"/>
		</arg>
	</component>
	<component class="org.seasar.dao.impl.ValueTypeFactoryImpl"/>
	<component 
		name="stringClobType" 
		class="org.seasar.extension.jdbc.types.StringClobType"
	/>
	<component class="org.seasar.dao.impl.BeanMetaDataFactoryImpl"/>
	<component class="org.seasar.dao.impl.DaoNamingConventionImpl"/>
	<component class="org.seasar.dao.impl.NullBeanEnhancer"/>
</components>


--[j2ee.dicon]------------------------------
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
	"http://www.seasar.org/dtd/components21.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
		name="resultSetFactory"
		class="org.seasar.dao.pager.PagerResultSetFactoryWrapper">
		<arg>
			<component class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/>
		</arg>
		<property name="useScrollCursor">true</property>
	</component>
	<!--
	<component
		name="resultSetFactory"
		class="org.seasar.dao.pager.PagerResultSetFactoryLimitOffsetWrapper">
		<arg>
			<component class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/>
		</arg>
		<arg>dataSource</arg>
	</component>
	-->


	<component class="org.seasar.extension.jdbc.impl.ConfigurableStatementFactory">
		<arg>
			<component class="org.seasar.dao.pager.PagerStatementFactory"/>
		</arg>
		<property name="fetchSize">100</property>
		<!--
		<property name="maxRows">100</property>
		-->
	</component>


	<!--
	<component class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/>
	<component class="org.seasar.extension.jdbc.impl.ConfigurableStatementFactory">
		<arg>
			<component class="org.seasar.extension.jdbc.impl.BasicStatementFactory"/>
		</arg>
		<property name="fetchSize">100</property>
		<! - -
		<property name="maxRows">100</property>
		- - >
	</component>
	<component class="org.seasar.extension.jdbc.impl.OracleResultSetFactory"/>
	<component class="org.seasar.extension.jdbc.impl.BooleanToIntStatementFactory"/>
	-->

	<!-- for Derby -->

	<component name="xaDataSource"
		class="org.seasar.extension.dbcp.impl.XADataSourceImpl">

		<property name="driverClassName">
			"org.apache.derby.jdbc.ClientDriver"
		</property>

		<property name="URL">
			"jdbc:derby://localhost/MYDB"
		</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>
		<property name="allowLocalTx">true</property>
		<destroyMethod name="close"/>
	</component>
	<component name="dataSource"
		class="org.seasar.extension.dbcp.impl.DataSourceImpl"/>

</components>

--[サンプル実行後のテーブル]------------------------------
ij> select * from test;
ID    |NAME
---------------------------------------------------------
1     |test1
2     |test2

2 行が選択されました
ij>


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