MySQL学习笔记(十三)

132 阅读3分钟

这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

6、事务

  • 概念:transaction ,一个事务就是一个完整的业务逻辑

    • 完整的业务逻辑 :不可再分的最小的工作单元
  • 只有DML语句和事务有关系 , 因为只有DML语句是操作数据库中的数据的。涉及数据的改动,一定要保证安全。数据安全第一位

  • 理解:

    • 1、事务需要多条语句协同完成,相当于封装

    • 2、一个事务就是多条DML语句同时成功、同时失败

    • 3、在事务的执行过程中可以提交、回滚事务

      • 提交:清空事务性活动的日志文件(临时文件),将数据彻底持久化到数据库表之中。提交事务标志着事务的结束,并且是全部成功的结束。

        • commit 语句
      • 回滚:清空事务性活动的日志文件(临时文件),将之前的所有DML操作全部撤销。回滚事务标志着事务的结束,并且是全部失败的结束。

        • rollback 语句 , 只能回滚到上一次的提交点
    • 4、mysql中默认的事务行为 : 自动提交(每执行一次,提交一次)

    • 5、关闭自动提交机制 : start transaction ;

 【案例】:测试提交事务和回滚事务
 drop table if exists dept_bak ;
 create table dept_bak(
     DEPTNO int(2) not null ,
     DNAME varchar(14) ,
     LOC varchar(13) ,
     primary key (DEPTNO)
 );
 select * from dept_bak ;        // 记为表1
 ​
 start transaction ;
 insert into dept_bak (deptno , dname , loc) values (10 , 'SALES' , 'SHANDONG');
 insert into dept_bak (deptno , dname , loc) values (20 , 'SALES' , 'SHANDONG');
 insert into dept_bak (deptno , dname , loc) values (30 , 'SALES' , 'SHANDONG');
 insert into dept_bak (deptno , dname , loc) values (40 , 'SALES' , 'SHANDONG');
 select * from dept_bak ;    // 记为表2 , 查看与表1的区别
 ​
 rollback ;
 select * from dept_bak ;    // 记为表3 , 查看与表2的区别
 ​
 insert into dept_bak (deptno , dname , loc) values (10 , 'SALES' , 'SHANDONG');
 insert into dept_bak (deptno , dname , loc) values (20 , 'SALES' , 'SHANDONG');
 insert into dept_bak (deptno , dname , loc) values (30 , 'SALES' , 'SHANDONG');
 insert into dept_bak (deptno , dname , loc) values (40 , 'SALES' , 'SHANDONG');
 select * from dept_bak ;
 ​
 commit;
 rollback ;
 select * from dept_bak ;    // 记为表4 , 查看与表23的区别
 ​
 【结论】:rollback可以回滚到上一次的commit处
 无论是提交事务还是回滚事务都会结束事务
  • 事务的特性:ACID

    • 原子性:说明事务是最小的工作单元,不可再分
    • 一致性:在同一个事务中,所有的数据必须一次成功或者同时失败
    • 隔离性:A事务和B事务之间具有一定的隔离 (两个事务同时操作同一张表,类似于多线程并发访问同一张表)

    读未提交:read uncommitted ;

            -   描述:(最低事务隔离级别)事务A可以读取到事务B未提交的数据
            -   存在问题:脏读现象(dirty read)称读到了脏数据(未提交的数据),基本不用
    
        -   读已提交:read committed ;
    
            -   描述:事务A只能读取到事务B提交之后的数据
            -   解决问题:解决了脏读现象
            -   存在问题:不可重复读取数据
            -   数据100% 的真实。是oracle数据库默认的事务隔离级别
    
        -   可重复读:repeatable read ;
    
            -   描述:事务A开启之后,读取到的事务B中的数据都是一致的。即使在A开启后B事务的数据修改并且提交了,事务A读取到的数据还是不变
    
                相当于把表复制了一份,使用复印件进行操作。退出事务之后再次查询,或者开启新的事务,数据才会更新。
    
            -   解决问题:解决了不可重复读取数据的问题
    
            -   存在问题:可能会出现幻影读现象(读取到的数据都是幻象,数据不真实)
    
            -   是 mysql 中默认的事务隔离级别
    
    -   序列化 / 串行化:serializable ;
    
        -   描述:(最高事务隔离级别,效率最低),表示事务排队。类似于synchronized(线程同步)
        -   解决问题:解决了所有级别
        -   存在问题:效率最低
    
    • 持久性:事务最终结束的一个保障