2011-01-30 62 views
2

我使用spring事务将几个数据库更新操作包含到单个事务中。假设在单个事务中有2分贝更新。更新1成功,而第二次失败。我的问题是当这种情况发生时,即使第二个数据库更新失败导致事务回滚,第一个数据库更新也会提交给数据库。Spring编程Jdbc事务回滚不起作用

XML声明:

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
<property name="dataSource" ref="dataSource"/> 
</bean> 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
<property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
<property name="url" value="jdbc:mysql://localhost:3306/test" /> 
<property name="username" value="test" /> 
<property name="password" value="test" /> 
</bean> 

<bean id="testDao" class="dao.TestDao"> 
<constructor-arg > 
<ref local="simpleJdbcTemplate" />   
</constructor-arg> 
<constructor-arg > 
<ref local="txManager" />   
</constructor-arg> 
</bean> 

java代码:

public class DaoCallback extends TransactionCallbackWithoutResult { 
protected void doInTransactionWithoutResult(TransactionStatus arg0) { 
try{ 
    dbUpdate1(); 
    dbUpdate2(); 
}catch(Exception e){ 
    arg0.setRollbackOnly(); 
    } 
} 

我故意让dbUpdate1成功和dbUpdate2作为测试出来的回滚是否真的有效所以失败。当我通过代码进行调试时,我可以看到控制流运行到catch异常,并调用“setRollbackOnly()”方法。

但是,当我检查数据库,我可以看到从dbUpdate1()的变化。那么请帮忙解释这里有什么问题?

Dara kok,

回答

4

我发现了这个问题。这不是导致问题的代码。这是MySQL数据存储配置。 MyISAM不支持事务。

Spring应该已经显示了某种错误消息,以便开发人员可以知道事务正在数据库引擎上调用,而没有事务支持。

+0

你能否给你的问题添加更多描述(指示MyISAM)并标记为已回答? (反对你的回答:)) – 2011-01-30 07:38:04