• 《SpringBoot事务》单机mybatis事务控制


    一、场景再现

      我们同时操作两张表及以上,一张表操作成功后,第二张表操作失败,此时需要回滚上一次的操作。

    或者两次操作都成功,但后续业务处理的时候异常,此时需要回滚前面的所有数据库操作。

    二、代码

     1 @Service
     2 public class SiteWorkOrderServiceImpl implements ISiteWorkOrderService {
     3 
     4     @Override
     5     //在类或方法前注解配置@Transactional(rollbackFor=Exception.class)就可以实现:
     6     //当发生受控异常(checked exceptions)时,事务也进行回滚。
     7     @Transactional(rollbackFor=Exception.class)
     8     public void createOrder() throws BaseBusinessException {
     9        
    10     //第一次操作数据库        
    11     cbiOrderProcess.setWorkOrderNo(orderNo);       
    12     cbiOrderProcess.setTaskId(body.get("taskId"));     
    13     int insertNum = cbiOrderProcessMapper.insert(cbiOrderProcess);
    14     Assert.isTrue(insertNum >0, "插入结果为空"); //利用Assert代替if
    15 
    16     //第二次操作数据库
    17     SiteWorkOrder siteWorkOrder = new SiteWorkOrder();
    18     //Assert.isTrue(1==2); //测试回滚
    19     int orderNum = siteWorkOrderMapper.insert(siteWorkOrder);
    20     Assert.isTrue(orderNum >0, "插入结果为空");
    21   }
    22 }

    三、现象描述

      1、断点调试时,第一次操作完成,此时我们刷新数据库,实际是没有数据的

      2、抛出异常,程序终止,数据库没有数据

      3、要是第一次操作,表中有自增id,此时实际id已经自增,因为底层是序列,查询一次增加一次,要想回去,只能删除序列重新建。

  • 相关阅读:
    手误【删库】 == 跑路,不存在的 Linux回收站
    大规模集群全网数据备份解决方案
    宝塔Nginx配置防盗链
    Markdown语法
    QFtp编程模型(二)
    Ubuntu驱动程序开发6-Linux内核启动与程序烧写
    Ubuntu下TFTP、NFS和SSH服务搭建
    ubuntu环境变量的三种设置方式
    QByteArray详解
    mysql的索引下推理解和实践
  • 原文地址:https://www.cnblogs.com/weipt0106/p/13257970.html
Copyright © 2020-2023  润新知