2011-11-10 14 views
2

Java Springでは、トランザクションのロールバックに関する問題に直面しています。Springトランザクション管理

例:

私は私のコード(A、B、C)3つのDAOを有します。それらのすべてがJDBCTemplateを拡張:

@Transaction(propagation=new_required) 
public void serviceClassProc() throws Exception { 
    A.db1(); 
    B.db2(); 
    C.db3(); 
} 

を今すぐ上記のコードで、私はB.db2()に例外をスローした場合、何もロールバックされません取得します。私は、次のようB.db2を変更した場合

は今:その後、

@Transaction(propagation=nested,rollbackon=Exception.class) 
public void db2() throws Exception{ 
... 
throw new Exception(); 

} 

そしてserviceClassProc()を呼び出し、B.db2で唯一のトランザクションは、ロールバックされます。

serviceClassProc()内のすべてのトランザクションがロールバックされる実装が必要です。ここで

は2つの構成されている私が使用しています:

私は間違っているつもりです
<bean id="bonddao" class="com.marki.bonds.staticdata.dao.MuniStaticDataDaoImpl"> <property name="dataSource" ref="c3p0DataSource" /> </bean> <bean id="dcldao" class="com.bonds.staticdata.dao.DclSettingsDaoImpl"> <constructor-arg ref="c3p0DataSource" /> </bean> <bean id="batchlogdao" class="com.bonds.staticdata.dao.MuniFeedHandlerBatchLogDaoImpl"> <constructor-arg ref="c3p0DataSource" /> </bean> 

<bean id="bondsApplication" class="com.markit.bonds.staticdata.service.MuniRefDataSyncApp"> <property name="refdataService" ref="refDataSynchService" /> <property name="mailService" ref="mailSender"></property> <property name="batchLogger" ref="batchlogdao"></property> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="c3p0DataSource" /> </bean> <tx:annotation-driven transaction-manager="transactionManager" /> 

を? 3つのDAOをすべてJDBCテンプレートに拡張するのは間違っていますか?それらのすべてが同じJDBCTemplateを共有する必要がありますか?

+0

これが正しいかどうかわかりませんが、serviceClassProcメソッドにある@Transactionアノテーションにrollbackon = Exception.classを入れることは論理的です。あなたはそれを試しましたか? – Kevin

+0

LocalContainerEntityManagerFactoryBean、JdbcTemplate、TransactionManagerのxml構成を投稿してください – Ralph

+0

どのような種類の例外がスローされていますか?デフォルトでは、例外が 'RuntimeException'を延長した場合、Springはロールバックにtxsをマークするだけです。 – atrain

答えて

3

サービスメソッドのアノテーションにrollbackon=Exception.classを追加し、DAOメソッドからトランザクション注釈を完全に削除する必要があります。 DAOレベルでトランザクションを制御することは悪い考えです。

+0

+1 35秒。より速く – Ralph

+0

私はrollbackon = Exception.classを試しましたが、うまくいきませんでした。 3つのDAOのすべてがjdbctemplateを拡張すると、3つのトランザクションすべてに独自の接続があることを意味します。それが問題の原因かどうかはわかりません。 – Lokesh

関連する問題