Java Spring事务管理

Java Spring事务管理,java,spring,transactions,Java,Spring,Transactions,在JavaSpring中,我面临一个关于事务回滚的问题 例如: 我的代码中有3个DAO(A、B、C)。它们都扩展了JDBCTemplate: @Transaction(propagation=new_required) public void serviceClassProc() throws Exception { A.db1(); B.db2(); C.db3(); } 现在,对于上面的代码,如果我在B.db2()中抛出异常,则不会回滚任何内容 现在,如果我修改B.

在JavaSpring中,我面临一个关于事务回滚的问题

例如:

我的代码中有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
添加到服务方法的注释中,并从DAO方法中完全删除事务注释。在DAO级别拥有事务控制是个坏主意。

您还可以使用:
**org.springframework.transaction.interceptor.TransactionSpectSupport**

下面是一个您可以处理的示例:

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class, transactionManager = "transactionManager")
public void messageHandler() {
            try {
                //TODO your own code

            } catch (Exception ex) { 
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            } finally { 

            } 

}

我不知道这是否正确,但将rollbackon=Exception.class放在serviceClassProc方法上的@Transaction注释中是合乎逻辑的。您试过了吗?请发布LocalContainerEntityManagerFactoryBean、JdbcTemplate、TransactionManager的xml配置。引发了哪些类型的异常?请注意,默认情况下,如果异常扩展了RuntimeException,Spring只会将txs标记为回滚。我尝试了rollbackon=exception.class,但它不起作用。在某个地方,我觉得所有三个dao的扩展jdbctemplate意味着所有三个事务都有自己的连接。我不确定这是否是问题的根源。