当前位置:编程学习 > JAVA >>

有关ibatis事务问题

下面代码为什么在出现异常时,不能回滚事务?希望帮忙看看。
sql-map-config.xml
<sqlMapConfig>
<settings cacheModelsEnabled="true" enhancementEnabled="true"
lazyLoadingEnabled="true" maxRequests="32" maxSessions="10"
maxTransactions="5" useStatementNamespaces="false" />

<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />
<property name="JDBC.ConnectionURL" value="jdbc:mysql://......." />
<property name="JDBC.Username" value="..." />
<property name="JDBC.Password" value="..." />
</dataSource>
</transactionManager>

<sqlMap resource="account.xml" />

</sqlMapConfig>

account.xml
<sqlMap namespace="account">

<select id="getAccount" parameterClass="java.lang.String"
resultClass="example.Account">
select * from account where username = #value#
</select>

<insert id="createAccount" parameterClass="example.Account">
insert into account
(username, password)
values ( #username#, #password# )
</insert>

<update id="updateAccount" parameterClass="example.Account">
update account set
password = #password# WHERE username = #username#
</update>

<delete id="deleteAccount" parameterClass="java.lang.String">
DELETE account WHERE
username = #value#
</delete>

</sqlMap>

Main1.java
public class Main1 {

public static void main(String[] args) throws IOException {

SqlMapClient sqlMapClient = SqlMapConfig.getSqlMapInstance();
try {
sqlMapClient.startTransaction();

Account account = (Account) sqlMapClient.queryForObject("getAccount", "a");
account.setPassword("aaa");
sqlMapClient.update("updateAccount", account);

Account account1 = (Account) sqlMapClient.queryForObject("getAccount", "c");
account1.setPassword("bbb");
sqlMapClient.update("updateAccount", account1);

sqlMapClient.commitTransaction();

} catch(SQLException e) {
e.printStackTrace();
} finally {
try {
sqlMapClient.endTransaction();
} catch(SQLException e) {
e.printStackTrace();
}
}
}
}

上面的代码在执行到Account account1 = (Account) sqlMapClient.queryForObject("getAccount", "c");出现异常,因为表中没有username=c的记录。理论上username=a,更新password=aaa的操作应该是回滚呀。但是我现在都不回滚。希望明白的同学帮帮忙。 --------------------编程问答-------------------- 怎么没有人理? --------------------编程问答-------------------- 不知道发生异常的时候会不会自动回滚

lz手动调用下 sqlMapClient.rollbackTransaction()

或 

sqlMapClient.getCurrentConnection().rolback();

试试 --------------------编程问答-------------------- 可能是ibatis的bug
用spring管理ibatis的事务才成功 --------------------编程问答--------------------
引用 2 楼  的回复:
不知道发生异常的时候会不会自动回滚

lz手动调用下 sqlMapClient.rollbackTransaction()

或 

sqlMapClient.getCurrentConnection().rolback();

试试

试了。不行。 --------------------编程问答--------------------
引用 3 楼  的回复:
可能是ibatis的bug
用spring管理ibatis的事务才成功

到目前我的调查结果也是这样。单独使用ibatis,根本找不到回滚的方法。不知道还有没有人知道怎么回事。 --------------------编程问答-------------------- 沉了。 --------------------编程问答-------------------- 难倒是传说中的bug,呵呵lz幸运了
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,