[Seasar-user:4112] SQL Server2000のトランザクションロールバックについて
Tada Hideaki
[E-MAIL ADDRESS DELETED]
2006年 7月 18日 (火) 17:22:12 JST
はじめまして。多田と申します。
S2 + S2Dao + SQL Server 2000 でトランザクション処理に困っています。
解決策がありましたらご教授お願いいたします。
環境は
s2-2.3.10
s2dao-1.0.35
SQL Server 2000
SQL ServerのJDBCドライバは、
Microsoft SQL Server 2005 JDBC Driver(sqljdbc.jar)Version 1.0
http://msdn.microsoft.com/data/ref/jdbc/
を使用しています。
上記環境にて、
Seasarのトランザクション(j2ee.requiredTx)をうまく適用できませんでした。
内容としては、テスト的に同じテーブルに連続で同じデータを挿入して
PRIMARY KEY 違反 → ロールバック → データ残らない
というようなもので、
ログ上は「トランザクションをロールバックしました」と出るのですが、
DB上にはデータが残ってしまいます。
コードは以下のようになっております。
//////////////////////////////////////////////////
@S2Dao(bean=User.class)
public interface UserDao {
int insert(User user);
int update(User user);
int delete(User user);
List<User> getAll();
List<User> getUser(User user);
}
public interface TransactTestClient {
void add();
}
public class TransactTestClientImpl implements TransactTestClient {
private UserDao userDao;
public TransactTestClientImpl(UserDao userDao) {
this.userDao = userDao;
}
public void add() {
User user = new User();
user.setName("testName");
user.setPassword("testPass");
user.setFullname("testFullName");
userDao.insert(user);
// ★ ↓ここで重複発生 ↑これ(1件目)がロールバックされるようにしたい ★
userDao.insert(user);
}
}
public class TransactTestMain {
private static String PATH = "tranClient.dicon";
public static void main(String[] args) {
S2Container container = S2ContainerFactory.create(PATH);
container.init();
try {
TransactTestClient cl =
(TransactTestClient) container.getComponent(
TransactTestClient.class);
cl.add();
} finally {
container.destroy();
}
}
}
/// tranClient.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="tranDao.dicon"/>
<include path="j2ee.dicon"/>
<component class="XXX.TransactTestClientImpl">
<arg>UserDao</arg>
<aspect>j2ee.requiredTx</aspect>
</component>
</components>
/// tranDao.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="UserDao" class="XXX.UserDao">
<aspect>dao.interceptor</aspect>
</component>
</components>
/// データベース設定(抜粋) /////////////////////
<component name="xaDataSource"
class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
<property name="driverClassName">
"com.microsoft.sqlserver.jdbc.SQLServerDriver"
</property>
<property name="URL">
"jdbc:sqlserver://IP:Port;DatabaseName=DbName;SelectMethod=cursor"
</property>
<property name="user">"xxx"</property>
<property name="password">"xxx"</property>
</component>
<component name="connectionPool"
class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
<property name="timeout">600</property>
<property name="maxPoolSize">3</property>
<property name="allowLocalTx">true</property>
<destroyMethod name="close"/>
</component>
<component name="dataSource"
class="org.seasar.extension.dbcp.impl.DataSourceImpl"/>
/// ログ /////////////////////////////////////////
[main] トランザクションを開始しました
[main] 物理的なコネクションを取得しました
[main] 論理的なコネクションを取得しました
[main] 論理的なコネクションを閉じました
[main] 論理的なコネクションを取得しました
[main] INSERT INTO USERS (password, fullname, name) VALUES ('testPass',
'testFullName', 'testName')
[main] 論理的なコネクションを閉じました
[main] 論理的なコネクションを取得しました
[main] INSERT INTO USERS (password, fullname, name) VALUES ('testPass',
'testFullName', 'testName')
[main] 論理的なコネクションを閉じました
[main] トランザクションをロールバックしました
[main] 物理的なコネクションを閉じました
//////////////////////////////////////////////////
何か設定が足りない・間違っている等ありますでしょうか?
アドバイス、よろしくお願いいたします。
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: http://ml.seasar.org/archives/seasar-user/attachments/20060718/0b22b28b/attachment.html
Seasar-user メーリングリストの案内