[Seasar-user:20880] Re: Seasar2.4 トランザクションに関する質問です
higayasuo
[E-MAIL ADDRESS DELETED]
2011年 7月 25日 (月) 16:49:39 JST
ひがです。
まず、Webアプリなので、S2ContainerFactory.create()を呼ぶ必要はないです。
transaction_dao.dicon でトランザクション用のinterceptorを指定してないので、
トランザクションがかからないのはしょうがないかなと思います。
Seasar 2 徹底入門 SAStruts/S2JDBC
http://www.amazon.co.jp/Seasar-%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80-SAStruts-S2JDBC-%E5%AF%BE%E5%BF%9C/dp/4798121509
は基礎から丁寧に説明されているのでおすすめです。
(2011/07/22 11:15), [E-MAIL ADDRESS DELETED] wrote:
> 社納と申します。
> トランザクションに関して伺いた い事があり、メールさせて頂きました。
> 今、S2Container 2.4.42 、 s2-dao-1.0.51 、 PostgreSQL 8.3.9 、
> Tomcat6.0.26
> の組み合わせで、Webアプリケーションを作成しております。
> j2ee.requiredTx を適用させ、複数のSQLを一つのトランザクションにまとめ
> たいのですが、
> 途中でエラーを発生させてみると、エラー前のSQL実行結果はロールバックで
> きておらず、
> 各SQL文単位でコミットされてしまい困っております。
> もっとも、ログを見る限りでは
> 「トランザクションを開始しました」
> の後に複数のSQLが実行されて いる事が確認でき、さらに、エラーを発生させ
> た箇所で
> 「トランザクションをロールバックしました」
> と表示されており、何も問題無い ように見えます。
>
> これは、そもそも JTAによるトランザクションが開始できていないのかと考え、
> jdbc.dicon の "allowLocalTx" を true から false に変えてみると、
> 果たして「[ESSR0311]トランザクションが開始されていません」として例外が
> スローされたのですが、
> その例外をgetClass()で調べてみると
> http://s2container.seasar.org/2.4/ja/jdbc.html#S2DBCPに記載されている
> java.lang.IllegalStateException
> ではなく、
> org.seasar.framework.exception.SIllegalStateException
> という前者を継承したクラスであ り、Webサイトの記載と異なるという点で、
> JTA云々以前に何か間違った事をしているのではないかと不安になりました。
> これは、設定を間違えているので しょうか?
> 又、JTAによるトランザクションが開始できていないのは確かで
> その原因が下記のコードから判断できるようでしたら、ご指摘頂けないでしょ
> うか?
> 以上、宜しくお願い申し上げま す。
> *-*-*-*-*-*-*-*-*-*-*-*-*-*
> ////////// “処理の最初に呼ばれるメソッド” //////////
> :
> :
> :
> S2Container container =
> S2ContainerFactory.create("XXX/transaction_service.dicon");
>
> TransactionTestService transactionTestService =
> (TransactionTestServiceImpl)
> container.getComponent("TransactionTestService");
> transactionTestService.method(xxxxxx);
> :
> :
> :
> ////////// transaction_service.dicon //////////
> <?xml version="1.0" encoding="UTF-8"?>
> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
> "http://www.seasar.org/dtd/components24.dtd">
> <components>
> <include path="j2ee.dicon" />
>
> <component name="TransactionTestService"
> class="XXX.XXX.impl.TransactionTestServiceImpl">
> <aspect>j2ee.requiredTx</aspect>
> </component>
> </components>
> ////////// TransactionTestService.java //////////
> public interface TransactionTestService {
> void method(XXXXXX xxxxxx);
> }
> ////////// TransactionTestServiceImpl.java //////////
> :
> :
> :
> /** コンストラクタ. */
> public TransactionTestServiceImpl() { };
> public void method(XXXXXX xxxxxx) {
> S2Container container =
> S2ContainerFactory.create("XXX/transaction_dao.dicon");
>
> TransactionTestDao transactionTestDao = (TransactionTestDao) container.
> getComponent("TransactionTestDao");
> transactionTestDao.addSQL1(xxxxxx);
> transactionTestDao.addSQL2(xxxxxx);
> transactionTestDao.addSQL3(xxxxxx);
>
> // ここでエラーを起こして処理を中断 (スローした例外は“処理の最初に呼ば
> れるメソッド”でキャッチ)
> ×××××(エラーを起こすコード)
>
> transactionTestDao.addSQL4(xxxxxx);
> transactionTestDao.addSQL5(xxxxxx);
> }
> :
> :
> :
>
> ////////// transaction_dao.dicon //////////
>
> <?xml version="1.0" encoding="UTF-8"?>
> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
> "http://www.seasar.org/dtd/components24.dtd">
> <components>
> <include path="dao.dicon" />
> <component name="TransactionTestDao" class="XXX.TransactionTestDao">
> <aspect>dao.interceptor</aspect>
> </component>
> </components>
> ////////// TransactionTestDao.java //////////
> public interface LoginListDao {
> Class<XXXXXX> BEAN = XXXXXX.class;
> String addSQL1_SQL_FILE = "XXX/XXX/XXXXX/addSqlOneQuery.sql";
> String addSQL2_SQL_FILE = "XXX/XXX/XXXXX/addSqlTwoQuery.sql";
> String addSQL3_SQL_FILE = "XXX/XXX/XXXXX/addSqlThreeQuery.sql";
> String addSQL4_SQL_FILE = "XXX/XXX/XXXXX/addSqlFourQuery.sql";
> String addSQL5_SQL_FILE = "XXX/XXX/XXXXX/addSqlFiveQuery.sql";
> String addSQL1_ARGS = "xxxxxx";
> String addSQL2_ARGS = "xxxxxx";
> String addSQL3_ARGS = "xxxxxx";
> String addSQL4_ARGS = "xxxxxx";
> String addSQL5_ARGS = "xxxxxx";
> void addSQL1(XXXXXX xxxxxx);
> void addSQL2(XXXXXX xxxxxx);
> void addSQL3(XXXXXX xxxxxx);
> void addSQL4(XXXXXX xxxxxx);
> void addSQL5(XXXXXX xxxxxx);
> }
> ////////// app.dicon //////////
> <?xml version="1.0" encoding="UTF-8"?>
> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
> "http://www.seasar.org/dtd/components24.dtd">
> <components>
>
> <include path="convention.dicon"/>
> <include path="aop.dicon"/>
> <include path="j2ee.dicon"/>
>
> </components>
> ////////// convention.dicon //////////
> <?xml version="1.0" encoding="UTF-8"?>
> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
> "http://www.seasar.org/dtd/components24.dtd">
> <components>
>
> <component
> class="org.seasar.framework.convention.impl.NamingConventionImpl">
> <initMethod name="addRootPackageName">
> <arg>"org.seasar.framework.container.warmdeploy"</arg>
> </initMethod>
> </component>
>
> <component
> class="org.seasar.framework.convention.impl.PersistenceConventionImpl"/>
>
> </components>
> ////////// jdbc.dicon //////////
> <?xml version="1.0" encoding="UTF-8"?>
> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
> "http://www.seasar.org/dtd/components24.dtd">
> <components namespace="jdbc">
> <include path="jta.dicon"/>
> <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>
> </component>
> <component name="xaDataSource"
> class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
> <property name="driverClassName">"org.postgresql.Driver"</property>
> <property name="URL">"jdbc:postgresql://XXXXXXXXXXXX"</property>
> <property name="user">"XXXXXXXX"</property>
> <property name="password">"XXXXXXXX"</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> <!-- ←★ falseにすると例
> 外をスロー ★ -->
> <destroyMethod name="close"/>
> </component>
> <component name="dataSource"
> class="org.seasar.extension.dbcp.impl.DataSourceImpl"/>
> </components>
>
>
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://ml.seasar.org/archives/seasar-user/attachments/20110725/09a49df1/attachment.html>
Seasar-user メーリングリストの案内