我使用spring transaction将一些db update操作包含在一个事务中。假设在单个事务中有2个db更新。更新1成功,而第二次失败。我的问题是,当发生这种情况时,即使第二次db更新失败导致事务回滚,第一次db更新也会提交到db。
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,
答案 0 :(得分:4)
我发现了问题。这不是导致问题的代码。它是MySQL数据存储配置。 MyISAM不支持交易。
Spring应该显示某种错误消息,以便开发人员可以知道在没有事务支持的情况下在数据库引擎上调用事务。