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