我遇到了一个问题“Spring transaction fail rollback”。我有一个服务类,它调用2 DAO将数据插入到DB表中。
emTrcvLineDAO.create(lineVo)无法插入到表中,因为lineVo缺少一些必填字段,但emTrcvHeaderDAO.create(vo)无法回滚,数据仍然成功插入到数据库中。我想知道为什么它不回滚,因为两个DAO在同一个事务中。
有人对此有所了解吗?提前谢谢。
public void saveEmTrcvHeader(List<EmTrcvHeaderVOImpl> voList, List<ResponseItem> responseItemList) {
for (EmTrcvHeaderVOImpl vo : voList) {
emTrcvHeaderDAO.create(vo);
List<EmTrcvLineVOImpl> lineList = vo.getLineList();
for (int i = 0; i < lineList.size(); i++) {
EmTrcvLineVOImpl lineVo = lineList.get(i);
lineVo.setEmTrcvHeaderId(vo.getEmTrcvHeaderId());
lineVo.setProjId(null);
emTrcvLineDAO.create(lineVo);
}
}
}
我的交易配置:
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="proxyTargetClass">
<value>true</value>
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED,-java.lang.Exception,-org.springframework.dao.DataAccessException</prop>
<prop key="*">PROPAGATION_REQUIRED,-java.lang.Exception,-org.springframework.dao.DataAccessException</prop>
</props>
</property>
</bean>
我的服务和dao定义如下:
<bean name="emTrcvHeaderService" parent="txProxyTemplate">
<property name="target">
<bean class="com.emtrcv.service.EmTrcvHeaderService">
<property name="emTrcvHeaderDAO">
<ref bean="emTrcvHeaderDAO"/>
</property>
<property name="emTrcvPubSelectIdsDAO">
<ref bean="emTrcvPubSelectIdsDAO"/>
</property>
<property name="emTrcvLineDAO">
<ref bean="emTrcvLineDAO"/>
</property>
</bean>
</property>
</bean>
<bean name="emTrcvHeaderDAO" class="com.emtrcv.dao.EmTrcvHeaderDAOImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean name="emTrcvPubSelectIdsDAO" class="com.emtrcv.dao.EmTrcvPubSelectIdsDAOImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean name="emTrcvLineDAO" class="com.emtrcv.dao.EmTrcvLineDAOImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
答案 0 :(得分:0)
我认为您必须提及何时应该进行回滚。 按照文档, 回滚规则的概念很重要:它们使您能够指定哪些异常(和throwable)应该导致自动回滚。您可以在配置中以声明方式指定它,而不是在Java代码中。因此,尽管您仍然可以在TransactionStatus对象上调用setRollbackOnly()来回滚当前事务,但大多数情况下您可以指定MyApplicationException必须始终导致回滚的规则。
请参阅http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html了解详情
答案 1 :(得分:0)
最后我找到了根本原因。有两个重复的Spring配置文件都在项目中定义了事务管理规则,它使spring tranasction管理不起作用。删除其中一个后,它就可以了。