• mybatis spring的事务处理,手动处理。


    因为在spring中,事务是自动处理的,在过程中不能使用rollback,commit等语句。

    现在将如何手动处理,介绍如下:

    一,在service层,

    1.首先引入从spring中的事务处理器,这个是从xml文件中定义的事务管理器名称

    @Autowired
        private DataSourceTransactionManager transactionManager;

    2.在service层加入如下代码

    public int addZhouyiYao(ZhouyiYao zhouyiYao) throws Exception  {
            DefaultTransactionDefinition def = new DefaultTransactionDefinition();
            // explicitly setting the transaction name is something that can be done only programmatically
            def.setName("SomeTxName");
            def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    
            TransactionStatus status = transactionManager.getTransaction(def);
            try {
                // execute your business logic here
                zhouyiYaoMapper.addYao(zhouyiYao);
                zhouyiYaoMapper.updateYaoOrder(zhouyiYao.getId(), zhouyiYao.getId()*10);    //为了保证这两个处理语句的一致性
                
            }
            catch (Exception ex) {
                transactionManager.rollback(status);
                throw ex;
               }
            transactionManager.commit(status);
            return zhouyiYao.getId();
            
        }

    二、在controller层,因为有异常抛出,所以要处理一下

    int addZhouyiYao = 0 ;
            try {
                addZhouyiYao = zhouyiYaoService.addZhouyiYao(zhouyiYao);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                errors.addError(new FieldError("zhouyiYao", "yaoId", "*事务一致性处理错误"));
            }
            

    controller后面的代码是

    if (errors.getErrorCount() > 0) {
                mv.addObject("zhouyiIndex", zhouyiIndexService.getZhouyiIndexs());  //预先加载的本页的其他类别值
                mv.setViewName("admin116/zhouyiYaoAdd");
                for (FieldError err : errors.getFieldErrors()) {
                    System.out.println("getField:== " + err.getField() + " getDefaultMessage:== " + err.getDefaultMessage()
                            + " getObjectName:== " + err.getObjectName() + " getCode:== " + err.getCode());
                }
                return mv;
            }
            mv.setViewName("redirect:/admin116/getYaos?pn="+addZhouyiYao);
            return mv;

    这样,就可以有错误提示了。

    本段代码主要从spring的官方文档中提出。

     =================================================

    另一分不带返回值的代码示例

    service部分

    public void addZhouyiContent(ZhouyiContent zhouyiContent) throws Exception {
            
            DefaultTransactionDefinition def = new DefaultTransactionDefinition();
            // explicitly setting the transaction name is something that can be done only programmatically
            def.setName("SomeTxName");
            def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    
            TransactionStatus status = transactionManager.getTransaction(def);
            try {
                // execute your business logic here
                zhouyiContentMapper.addZhouyiContent(zhouyiContent);
                zhouyiContentMapper.updateZhouyiContentOrder(zhouyiContent.getId(), zhouyiContent.getId()*10);
                
            }
            catch (Exception ex) {
                transactionManager.rollback(status);
              
                    throw ex;
                 //ex.printStackTrace();
            }
            transactionManager.commit(status);
        }

    controller部分

    @RequestMapping("/zhouyiContentSave")
        public ModelAndView zhouyiContentSave(@Valid ZhouyiContent zhouyiContent,BindingResult errors,@SessionAttribute("authorId") Integer authorId) {
            ModelAndView mv = new ModelAndView();
            
            
            try {
                zhouyiContentService.addZhouyiContent(zhouyiContent);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                errors.addError(new FieldError("zhouyiContent", "info", "*事务一致性处理错误"));
            }
            if(errors.getErrorCount()>0) {
                mv.addObject("tips", null);
                mv.addObject("errors", "*添加保存异常!");
                mv.addObject("zhouyiAuthor", zhouyiAuthorService.getZhouyiContentAuthorById(authorId));
                mv.addObject("zhouyiYao",zhouyiYaoService.getZhouyiYaos() );
                mv.setViewName("admin116/zhouyiContentAdd");
                return mv;
            }
            mv.addObject("tips", zhouyiContent.getId()+"条,添加成功!");
            mv.setViewName("forward:/admin116/zhouyiContentAdd");
            
            return mv;
        }
  • 相关阅读:
    HTTP 错误 500.19 配置文件错误 ( 0x8007000d,0x80070032)
    system.web下的HttpModules节点和system.webServer下的modules节点的配置区别
    索引超出了数组界限(Microsoft.SqlServer.Smo)
    VS 附加进程调试 Web项目
    VS 调试 无法启动IIS Express Web 服务器(进程不存在)
    java基础面试题
    给dubbo接口添加白名单——dubbo Filter的使用
    mysql行转列转换
    Spring透过ApplicationListener来触发contextrefreshedevent事件
    spring mvc之请求过程源码分析
  • 原文地址:https://www.cnblogs.com/sdgtxuyong/p/12322147.html
Copyright © 2020-2023  润新知