问题遇到的现象和发生背景
数据库用的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””’
我想要达到的结果
数据回滚成功