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を共有する必要がありますか?
これが正しいかどうかわかりませんが、serviceClassProcメソッドにある@Transactionアノテーションにrollbackon = Exception.classを入れることは論理的です。あなたはそれを試しましたか? – Kevin
LocalContainerEntityManagerFactoryBean、JdbcTemplate、TransactionManagerのxml構成を投稿してください – Ralph
どのような種類の例外がスローされていますか?デフォルトでは、例外が 'RuntimeException'を延長した場合、Springはロールバックにtxsをマークするだけです。 – atrain