当前位置 : 主页 > 网页制作 > Nodejs >

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

来源:互联网 收集:自由互联 发布时间:2021-06-24
调用webservice接口,数据不回滚问题 使用cxf+spring框架开发webservice接口,在开发一个具有保存数据的接口功能时,如果数据发生了异常,对service层无论使用了xml配置声明式事务管理还是使用
  • 调用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;
    }
网友评论