数据库用的pgsql,框架用的springmvc。是一个比较旧的项目。
目前发现代码报错没有回滚数据,因为其被try catch且没有抛出,所以
1.controller:
@RequestMapping(value="/addparameters", produces="application/json; charset=utf-8")
public @ResponseBody String addParameterDatahandler(@RequestParam("param") String param)
{
return this.srcResultService.addParameter(param);
}
2.service:
String addParameter(String param);
3.impl方法头部注解:
@Override
@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public String addParameter(String param) {
impl方法回滚代码:
catch (Exception ex) {
rs.put("status", 0);
rs.put("message", ex.getMessage());
System.out.println(ex);
//捕获到异常事务回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
//返回前端信息
return rs.toString();
4.xml配置:
<!-- 配置事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 事务注解驱动,标注@Transactional的类和方法将具有事务性 -->
<tx:annotation-driven transaction-manager="txManager"/>
<!-- 声明方式装载事务 -->
<tx:advice id="customTxAdvice_sa" transaction-manager="transactionManager_sm">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="upd*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="select*" read-only="true" propagation="NOT_SUPPORTED"/>
<tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED"/>
</tx:attributes>
</tx:advice>
<!-- 面向切面方式装载事务 -->
<aop:config>
<aop:pointcut id="customPointcut_sa"
expression="execution(* com.apportionment.service.impl..*.*(..))"/>
<aop:advisor advice-ref="customTxAdvice_sa" pointcut-ref="customPointcut_sa"/>
</aop:config>
捕获到异常,进入catch,运行到“TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();”这一句的会后里面报“No transaction aspect-managed TransactionStatus in scope”错误。服务器返回“500”,但是数据没有回滚。
1.修改注解 @Transactional/@Transactional(rollbackFor = Exception.class).
2.手动开启事务,但开启的时候报错:‘““No transaction aspect-managed TransactionStatus in scope””’
数据回滚成功
事务你已经交给DataSourceTransactionManager进行管理了,配置注解之后如果想要回滚,就不要将异常捕捉消化掉,直接将异常抛出,事务就回滚了
这写的啥玩意哟,rs这应该是接口层的东西吧,你事务加到接口来了?
把事务注解中的propagation = Propagation.REQUIRED,去掉改成如下代码
@Transactional(rollbackFor = Exception.class)
你都申明了异常就回滚,你在catch中还做啥回滚操作呢?
代码完整一点
试试这个注解@Transactional(rollbackOn = Throwable.class)
把代码移植到最新版依赖中,实测可行。
方法里面捕获异常干嘛搞笑,可以全局捕获再去处理
采用事务,不用自动写回滚,异常了会自动回滚。
catch去掉,不然不会回滚。望采纳
catch (Exception ex) {
rs.put("status", 0);
rs.put("message", ex.getMessage());
System.out.println(ex);
//捕获到异常事务回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}