• SpringBoot之MySQL数据的丢失的元凶--事务(转)


    因为当时是跑定时任务去插入数据,大概是这样的

    //简单的定时任务,30分钟执行一次
    @Scheduled(cron = "0 0/30 * * * ?")
    public void dealInsertUserInfo(){
    userService.dealInsertUserInfo();
    }
    事后也没太注意它是否插入数据正常,直到第二天,有同事提出问题然后才发现表id自增到2000多了,数据一条都没有,尴尬!!!其实一般使用SpringBoot开发的都知道我们比较喜欢使用注解,一般会在service层加一个事务注解:@Transactional,毕竟可以根据不同的事务的隔离级别实现不同的功能,例如防止脏读、不可重复读以及幻读。但是事务失败则通过调用rollback()方法进行回滚,然后我的数据呢,就被它无情的吞掉了,然后我就shanlita

    事务回滚必要条件

    1.方法拦截——方法或者方法所在类被@Transactional注解
    2.
    异常——该方法的执行过程出现异常,事务管理器被触发,并对此做出处理
    3.
    指定异常——默认配置下,事务只会对Error与RuntimeException及其子类这些UNChecked异常,做出回滚。 一般的Exception这些Checked异常不会发生回滚(如果一般Exception想回滚要做出配置) 

    举个栗子:实现一般异常的回滚: 
    注解式:@Transactional(rollbackFor=Exception.class)

    4.异常抛出——方法中出现的指定异常,只有在被事务管理器捕捉到以后,事务才会据此进行事务回滚,比如:
       a.异常不捕捉,就会回滚 
       b.如果异常被try{}捕捉到,那么事务管理器就无法再捕捉异常,所以就无法做出反应,事务不回滚;(既catch(RuntimeException)) 
       c.如果异常被try{}捕捉了,我们还可以在Catch(){}中throw new RuntimeException(),手动抛出运行时异常供事务管理器捕捉;(既catch(){ throw new RuntimeException(); })
       d.手动回滚事务TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

    关闭自动事物回滚,使用@Rollback(false)关闭回滚。
     
    ————————————————
    版权声明:本文为CSDN博主「ZBYTSL」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/ZBYTSL/article/details/102833922

  • 相关阅读:
    [git 学习篇]自己在github创建一个远程服务器创库
    [git 学习篇]远程创库
    [git 学习篇]删除文件
    [git 学习篇] git checkout 撤销修改
    [git 学习篇]git管理的是修改,并非文件
    log4net面面观之Repository
    log4net面面观之工作原理
    asp.net获取当前页面文件名,参数,域名等方法。统一session验证和权限验证的方法
    C#使用Log4Net记录日志
    SharePoint 2010中的客户端AJAX应用——ASP.NET AJAX模板
  • 原文地址:https://www.cnblogs.com/xiaohanlin/p/12195488.html
Copyright © 2020-2023  润新知