咚咚锵· 2022-04-27 10:43 采纳率: 100%
浏览 1873
已结题

事务控制失效,报错“No transaction aspect-managed TransactionStatus in scope”

问题遇到的现象和发生背景

数据库用的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””’

我想要达到的结果

数据回滚成功

  • 写回答

9条回答 默认 最新

  • 拾光师 2022-04-27 11:01
    关注

    事务你已经交给DataSourceTransactionManager进行管理了,配置注解之后如果想要回滚,就不要将异常捕捉消化掉,直接将异常抛出,事务就回滚了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

问题事件

  • 系统已结题 5月12日
  • 已采纳回答 5月4日
  • 修改了问题 4月27日
  • 修改了问题 4月27日
  • 展开全部

悬赏问题

  • ¥15 UE5样条线生成的网格UV问题
  • ¥15 如何用最短的时间大致看懂springboot+vue的项目
  • ¥15 (有偿)懂数值分析和含时变参数微分方程的来
  • ¥15 layui父页的数据表格如何用弹窗页提交后的查询数据来更新数据表格内容?
  • ¥15 abaqus随机生成二维颗粒
  • ¥15 安装ansys许可证管理器时出现了这个问题,如何解决?
  • ¥100 高价求算法,利用智能手机传感器计算车辆的三轴g值
  • ¥15 Blazor server 数据库操作异常,如何解决?(语言-c#)
  • ¥15 uni-app开发APP运行到浏览器访问接口跨域
  • ¥100 mfc消息自创建控件