2011-11-10 62 views
2

在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吗?

+0

我不知道这是否正确,但将rollbackon = Exception.class放在serviceClassProc方法的@Transaction注释中是合乎逻辑的。你尝试过吗? – Kevin

+0

请发布LocalContainerEntityManagerFactoryBean,JdbcTemplate,TransactionManager的xml配置 – Ralph

+0

抛出哪些类型的异常?请注意,默认情况下,如果异常在'RuntimeException' – atrain

回答

3

您应该将rollbackon=Exception.class添加到您的服务方法的注释中,并完全从DAO方法中删除事务注释。在DAO级别进行事务控制是一个糟糕的主意。

+0

+1的范围内延续35秒,Spring将仅标记回滚txs。更快 – Ralph

+0

我试过rollbackon = Exception.class,但它没有工作。某处我觉得所有三个dao的扩展jdbctemplate意味着所有三个事务都有自己的连接。我不确定是否会导致问题。 – Lokesh