• 事务执行一半,业务系统宕机,数据库的数据会怎样?


    业务系统提交了一个数据库dml指令,在尚未进行提交时,系统宕机了。那么数据库的数据会是修改前的,还是修改后的?数据库中的连接是否会断开,数据是否会被锁定?带着这些疑问,我们做的如下测试:

    1、在数据库中插入一条数据

      此时,数据库中用户密码为:test

    2、查看数据库的连接

    show FULL PROCESSLIST;
    

      

     此时存在一个连接,该连接时navicat的客户端连接

    3、查看数据库的事务

    SELECT * FROM information_schema.INNODB_TRX;

     不存在事务

    4、执行业务系统中的修改语句

    @Transactional(rollbackFor = Exception.class)
        public void update(){
            UserEntity userEntity = new UserEntity();
            userEntity.setId(2);
            //修改数据库的用户密码为 test112
            userEntity.setPassword("test112");
    
            userMapper.updateById(userEntity);
        }
    
        @Transactional(rollbackFor = Exception.class)
        public void shutdown(){
            update();
    
            try {
                //模拟长事务,方便我们测试系统宕机
                Thread.sleep(5000000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
    @Test
        public void testShutDown(){
    
            userService.shutdown();
        }
    

     执行testShutDown方法

    5、再次查看数据库的连接

      多了很多连接,这是因为我在代码中使用了数据库连接池,默认创建了5个连接

    6、再次查看数据库的事务

     

     此时有一个正在运行中的事务,且锁住了一行

    7、我们直接kill掉业务系统的进程

    taskkill /f /pid 13964

    8、查看数据库连接

    数据库连接已经关闭

    9、查看数据库事务

     

    事务已经没有了

    10、查看数据

     数据未改变

    --------------------------------------------

    以上测试在windows 10机器上进行测试的,mysql版本5.7.30 社区版,使用了druid连接池

    在centos 7.5上,其他条件不变,得到和上面一致结果

    在windows10上,使用jdbc连接,不使用连接池,其他条件不变,得到和上面有一致结果

    结论:当系统提交了数据库dml指令,但未执行commit,系统宕机了。此时,数据库的数据不会改变,数据库连接会被清除,数据库事务也会被清除,也不会锁定数据

     

  • 相关阅读:
    Future
    Vim 打开多个文件
    turboc报错:"unable to open file:c0s.obj "
    JNI(1)
    数据绑定控件ListView
    数据绑定控件ListView事件
    数据库取图片拼接ImageUrl
    数据绑定控件Reperter
    数据绑定控件ListView事件ItemCreated的Bug
    数据库系统为什么使用三级模式结构
  • 原文地址:https://www.cnblogs.com/damon-blogs/p/13904957.html
Copyright © 2020-2023  润新知