В java Spring я столкнулся с проблемой отката транзакции.
Пример:
В моем коде 3 DAO (A, B, C).Все они расширяются 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()
свернутыназад.
Вот две конфигурации, которые я использую:
<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?