MySQL学习笔记(十四)

113 阅读2分钟

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

      • 事务隔离级别:

        • 读未提交:read uncommitted ;

          • 描述:(最低事务隔离级别)事务A可以读取到事务B未提交的数据
          • 存在问题:脏读现象(dirty read)称读到了脏数据(未提交的数据),基本不用
        • 读已提交:read committed ;

          • 描述:事务A只能读取到事务B提交之后的数据
          • 解决问题:解决了脏读现象
          • 存在问题:不可重复读取数据
          • 数据100% 的真实。是oracle数据库默认的事务隔离级别
        • 可重复读:repeatable read ;

          • 描述:事务A开启之后,读取到的事务B中的数据都是一致的。即使在A开启后B事务的数据修改并且提交了,事务A读取到的数据还是不变

            相当于把表复制了一份,使用复印件进行操作。退出事务之后再次查询,或者开启新的事务,数据才会更新。

          • 解决问题:解决了不可重复读取数据的问题

          • 存在问题:可能会出现幻影读现象(读取到的数据都是幻象,数据不真实)

          • 是 mysql 中默认的事务隔离级别

      • 序列化 / 串行化:serializable ;

        • 描述:(最高事务隔离级别,效率最低),表示事务排队。类似于synchronized(线程同步)
        • 解决问题:解决了所有级别
        • 存在问题:效率最低
    • 持久性:事务最终结束的一个保障

    查看隔离级别:select @@transaction_isolation ;;

以下四个是测试数据,测试的时候1 , 2 , 4分别对3。

 【案例】:验证read uncommited
  drop table if exists t_user ;
  create table t_user(
     name varchar(255) 
  );
  
  select @@transaction_isolation ;
  set session transaction isolation level read uncommitted ;  // 设置全局事务的隔离级别
  select @@transaction_isolation ;
  
  use test ; 
  start trabsaction ;
  select * from t_user ;
  
 ​
 【案例】:验证read commited
  drop table if exists t_user ;
  create table t_user(
     name varchar(255) 
  );
  
  select @@transaction_isolation ;
  set session transaction isolation level read committed ;  // 设置全局事务的隔离级别
  select @@transaction_isolation ;
  
   use test ; 
   start trabsaction ;
   select * from t_user ;
   insert into t_user (name) values ('zhangsan');
 ​
 【案例】:验证repeatable read
  drop table if exists t_user ;
  create table t_user(
     name varchar(255) 
  );
  
  select @@transaction_isolation ;
  
   use test ; 
   select * from t_user ;
   insert into t_user (name) values ('zhangsan');
 ​
 【案例】:验证serializable
  drop table if exists t_user ;
  create table t_user(
     name varchar(255) 
  );
  
  select @@transaction_isolation ;
  set session transaction isolation level serializable ;  // 设置全局事务的隔离级别
  select @@transaction_isolation ;
  
   use test ; 
   select * from t_user ;
   insert into t_user (name) values ('zhangsan');