[英]Spring Transaction management
In java Spring, I am facing an issue regarding transaction rollback.在 java Spring 中,我面临着有关事务回滚的问题。
Example:例子:
I have 3 DAOs in my code (A, B, C).我的代码中有 3 个 DAO(A、B、C)。 All of them extend
JDBCTemplate
:它们都扩展了
JDBCTemplate
:
@Transaction(propagation=new_required)
public void serviceClassProc() throws Exception {
A.db1();
B.db2();
C.db3();
}
Now with the above code if I throw an exception in B.db2()
, nothing gets rolled back.现在使用上面的代码,如果我在
B.db2()
抛出异常,则不会回滚任何内容。
Now if I modify B.db2
as following:现在,如果我修改
B.db2
如下:
@Transaction(propagation=nested,rollbackon=Exception.class)
public void db2() throws Exception{
...
throw new Exception();
}
And then call serviceClassProc()
, only the transaction in B.db2
, gets rolled back.然后调用
serviceClassProc()
,只有B.db2
的事务被回滚。
I want an implementation where all transactions inside serviceClassProc()
get rolled back.我想要一个实现,其中
serviceClassProc()
中的所有事务都得到回滚。
Here are the 2 configurations I am using:这是我正在使用的 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" />
Where I am going wrong?我哪里出错了? Is it wrong to have 3 DAOs all extending JDBC template?
让 3 个 DAO 都扩展 JDBC 模板是错误的吗? Should all of them share same JDBCTemplate?
他们都应该共享相同的 JDBCTemplate 吗?
You should add rollbackon=Exception.class
to the annotation of your service method and remove the transaction annotation entirely from the DAO methods.您应该将
rollbackon=Exception.class
添加到服务方法的注释中,并从 DAO 方法中完全删除事务注释。 It is a bad idea to have transaction control at DAO level.在 DAO 级别进行事务控制是一个坏主意。
you can use also the : **org.springframework.transaction.interceptor.TransactionAspectSupport;**
你也可以使用:
**org.springframework.transaction.interceptor.TransactionAspectSupport;**
here is an example that you can handle it:这是一个您可以处理的示例:
@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 {
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.