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;
    }
原文地址:https://www.cnblogs.com/sdgtxuyong/p/12322147.html