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

事务控制失效,报错“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日
  • 展开全部

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改