2011-01-30 18 views
2

springトランザクションを使用して、1回のトランザクションに数回のdb更新操作を組み込みます。 1つのトランザクション内で2 dbの更新を言いましょう。更新1は成功し、2番目の更新は失敗します。私の問題は、そのようなケースが発生したとき、最初のdb updateはdbにコミットされますが、トランザクションのロールバックにつながる2回目のdb updateに失敗しました。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()からの変更を見ることができます。だから何が間違っているのか説明してください。

ダラック、

答えて

4

私はこの問題を発見しました。私が問題を引き起こしたコードではありません。それはMySQLのデータストレージの設定です。 MyISAMはトランザクションをサポートしていません。

Springは、トランザクションサポートなしでトランザクションがデータベースエンジン上で呼び出されていることを開発者が知ることができるように、何らかのエラーメッセージを表示する必要があります。

+0

あなたの質問(MyISAMを示す)に説明を追加し、回答としてマークしてください。 (あなたの答えに対して:)) –

関連する問題