- PR -

Seasarでトランザクションをロールバックできない問題について

1
投稿者投稿内容
beaora
会議室デビュー日: 2008/01/10
投稿数: 1
投稿日時: 2008-01-10 12:35
tomcat6.0
Seasar2.3.19
SqlServer2005
JDK1.6

Seasar2 はtomcatサーバーでSqlServerを接続する時、一つのServiceで2件のUpdate文を実行すると、一番目は成功するが、2番目は失敗します。
ログで、「トランザクションをロールバックしました」というメッセージを出したが、DBで一番目のUpdate文は更新した内容が依然として存在
していて、正常にロールバックしません。これは何故ですか。


ログは下記の通りです。
2008/01/10 09:26:27.812 [DEBUG] トランザクションを開始しました
2008/01/10 09:26:27.984 [DEBUG] UPDATE dbo.test
SET USER_PWD = 'tcl'
WHERE USER_NO = '15'
2008/01/10 09:26:28.375 [DEBUG] 物理的なコネクションを取得しました
2008/01/10 09:26:28.375 [DEBUG] 論理的なコネクションを取得しました
2008/01/10 09:26:28.531 [DEBUG] 論理的なコネクションを閉じました
2008/01/10 09:26:28.531 [DEBUG] 物理的なコネクションを閉じました
2008/01/10 09:26:28.609 [DEBUG] UPDATE dbo.test1
SET USER_PWD = 'abc'
WHERE USER_NO = '16'
2008/01/10 09:26:28.625 [DEBUG] 物理的なコネクションを取得しました
2008/01/10 09:26:28.625 [DEBUG] 論理的なコネクションを取得しました
2008/01/10 09:26:28.625 [DEBUG] 論理的なコネクションを閉じました
2008/01/10 09:26:28.625 [DEBUG] 物理的なコネクションを閉じました
2008/01/10 09:26:28.625 [DEBUG] トランザクションをロールバックしました
2008/01/10 09:26:28.671 [ERROR] org.seasar.framework.exception.SQLRuntimeException:
[ESSR0071]SQLで例外(ErrorCode=208, SQLState=42S02)が発生しました。理由は
org.seasar.framework.exception.SSQLException: [ESSR0072]SQLで例外(SQL=[UPDATE dbo.test
SET USER_PWD = ?

配置ファイル内容は下記の通りです。
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">
<include path="jdbc.dicon"/>
<!-- Seasar2トランザクションマネージャ -->
<component name="transactionManager"
class="org.seasar.extension.jta.TransactionManagerImpl"/>
<!-- トランザクション属性 -->
<component name="requiredTx" class="org.seasar.extension.tx.RequiredInterceptor">
<initMethod name="addRollbackRule">
<arg>@java.lang.RuntimeException@class</arg>
</initMethod>
</component>
<component name="requiresNewTx" class="org.seasar.extension.tx.RequiresNewInterceptor">
<initMethod name="addRollbackRule">
<arg>@java.lang.RuntimeException@class</arg>
</initMethod>
</component>
<component name="mandatoryTx" class="org.seasar.extension.tx.MandatoryInterceptor">
<initMethod name="addRollbackRule">
<arg>@java.lang.RuntimeException@class</arg>
</initMethod>
</component>
<component name="notSupportedTx" class="org.seasar.extension.tx.NotSupportedInterceptor">
<initMethod name="addRollbackRule">
<arg>@java.lang.RuntimeException@class</arg>
</initMethod>
</component>
<component name="basicResultSetFactory"
class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/>
<component name="basicStatementFactory"
class="org.seasar.extension.jdbc.impl.BasicStatementFactory"/>
<!-- SQL Server 2005 -->
<component name="sqlConnection" class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
<property name="driverClassName">"com.microsoft.jdbc.sqlserver.SQLServerDriver"</property>
<property name="URL">"jdbc:microsoft:sqlserver://192.168.1.216:1433;DatabaseName=test"</property>
<property name="user">"sa"</property>
<property name="password">"sa"</property>
<property name="setAutoCommit">false</property>
</component>
<component name="sqlConnectionPool" class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
<property name="timeout">600</property>
<property name="maxPoolSize">5</property>
<property name="allowLocalTx">true</property>
<property name="setAutoCommit">false</property>
<property name="XADataSource">sqlConnection</property>
<destroyMethod name="close"/>
</component>
<component name="dataSource" class="org.seasar.extension.dbcp.impl.DataSourceImpl">
<arg>sqlConnectionPool</arg>
</component>
</components>


test.dicon
<components>
<!--Aspect auto regist. -->
<component class="jp.co.business.service.impl.testServiceImpl">
<aspect>j2ee.requiredTx</aspect>
</component>
</components>


testServiceImpl.java
public class testServiceImpl extends PagerService implements testService {
private testDao dao;
public void setTestDao(testDao dao) {
this.dao = dao;
}
public int updatePassWord(String strNo, String strPwd) {
int iRtnValue = -1;
iRtnValue = dao.updatePassWord("15", "tcl");
iRtnValue = dao.updatePassWord1("16", "abc");
return iRtnValue;
}


大変困っています、よろしくお願いします。

[ メッセージ編集済み 編集者: beaora 編集日時 2008-01-10 12:38 ]
1

スキルアップ/キャリアアップ(JOB@IT)