2011-01-30 60 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