在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吗?
我不知道这是否正确,但将rollbackon = Exception.class放在serviceClassProc方法的@Transaction注释中是合乎逻辑的。你尝试过吗? – Kevin
请发布LocalContainerEntityManagerFactoryBean,JdbcTemplate,TransactionManager的xml配置 – Ralph
抛出哪些类型的异常?请注意,默认情况下,如果异常在'RuntimeException' – atrain