加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

调用webservice接口,数据不回滚问题

发布时间:2020-12-16 21:56:56 所属栏目:安全 来源:网络整理
导读:调用webservice接口,数据不回滚问题 使用cxf+spring框架开发webservice接口,在开发一个具有保存数据的接口功能时,如果数据发生了异常,对service层无论使用了xml配置声明式事务管理还是使用了使用@Transactional注解声明式事务管理,数据均不会回滚;在debug
  • 调用webservice接口,数据不回滚问题
    使用cxf+spring框架开发webservice接口,在开发一个具有保存数据的接口功能时,如果数据发生了异常,对service层无论使用了xml配置声明式事务管理还是使用了使用@Transactional注解声明式事务管理,数据均不会回滚;在debug代码和查询相关资料后,个人觉得数据不会回滚的原因:调用webservice接口时,发生的异常并没有在service被spring捕获到,而是直接抛出给调用接口的客户端,所以就没有回滚。这时候就需要在抛出异常的地方手动回滚事务。

  • 手动回滚事务原理
    org.springframework.transaction.support.TransactionTemplate:可以在service层方法中添加事务,Spring为我们提供了一种方法就是使用TransactionTemplate类;我们要为TransactionTemplate装配一个TransactionManager,调用TransactionTemplate实例的execute()方法将执行包含在TransactionCallback实例里的代码。如果代码出现异常,调用TransactionStatus对象的setRollbackOnly()将事务回滚。否则,如果doInTransaction()方法 正常返回,事务将被提交。

  • 手动回滚事务相关代码实现

xml文件配置

<!-- **************下面为事务控制相关配置:  手动方式******************** -->
    <!-- JDBC事务管理器 注意:事务管理器传的参数是数据源-->
     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"  scope="singleton" >
         <property name="dataSource">
             <ref bean="dataSource" />
         </property>
     </bean>
 

    <!-- 声明事务模板 -->
     <bean id="transactionTemplate"
         class="org.springframework.transaction.support.TransactionTemplate">
         <property name="transactionManager">
             <ref bean="transactionManager" />
         </property>
     </bean>

java代码

/*
     * 注入声明式事物模板
     */
    @Resource
    private JdbcDbDAO pubjdbcDAO;
    @Resource
    private TransactionTemplate transactionTemplate;
    public String SavePhysicianOrder(final String zyid,final String yzsllx,final String DATA_BUSINESS) {
        // TODO Auto-generated method stub
       //开始事务,如果出现状况则回滚
       String execute = transactionTemplate.execute(new TransactionCallback<String>() {
            String jsonStr="";//返回值
            @Override
            public String doInTransaction(TransactionStatus ts) {
                try {
                    // 使用JdbcTemplate进行持久化层操作
                    String delSQL="DELETE FROM ZYGL_YZMXB";//封装好的JdbcTemplate
                    int exeRnt=pubjdbcDAO.execSQL(delSQL);//封装J好的dbcTemplate
                    if(exeRnt <= 0){
                        jsonStr="操作失败!!";
                    }else{
                        jsonStr="操作成功!!";
                    }                 
                }
                catch (Exception e) {
                    ts.setRollbackOnly();
                    jsonStr="数据发生异常,异常信息:"+e.getLocalizedMessage();
                    return jsonStr;
                }
                // 如果成功,事务被提交
                return jsonStr;

            }
        });

        return execute;
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读