【后端面经-数据库】MySQL的事务隔离级别简介

端面,数据库,mysql,事务,隔离,级别,简介 · 浏览次数 : 47

小编点评

**目录** 1. 事务的概念 2. 事务隔离级别 3. 操作指令 4. 总结 5. 参考博文 **1. 事务的概念** 事务是指一连串集中操作指令,一个事务的执行必须执行完所有的动作才能算作执行结束。事务具有四个特点,简记作ACID: - **原子性:**事务的执行必须保证所有的动作都执行完毕。 - **一致性:**事务的执行必须保证数据的一致性。 - **隔离性:**事务的执行必须保证数据的隔离性。 - **持久性:**事务的执行必须保证数据的持久性。 **2. 事务隔离级别** 事务隔离级别是在大型数据库多个事务执行过程中,针对事务并行进行的机制设计,主要是围绕Isolation进行设计的。 **3. 操作指令** 操作指令是数据库执行的指令,用于操作数据库中的数据。常见的操作指令包括: - 写操作:用于将数据写入数据库。 - 读取操作:用于从数据库中读取数据。 - 撤销操作:用于取消一个事务中的操作。 **4. 总结** 对前期的事务隔离级别做一个表格梳理如下: |隔离级别 | 描述 | |---|---| |隔离级别名称 | 隔离级别的名称 | | Isolation | 支持的隔离级别 | | read uncommitted | 支持的读未提交 | | read committed | 支持的读已提交 | | 操作指令查看 | 当前的隔离级别 | **5. 参考博文** 参考博文-1和-2中介绍的各个隔离级别和操作指令。

正文

0. 事务的概念

事务指的是一连串的集中操作指令,一个事务的执行必须执行完所有的动作才能算作执行结束。事务具有四个特点,简记作ACID

  • A-Atomicity: 原子性,事务的执行必须保证所有的动作都执行完毕;
  • C-Consistency: 一致性,事务的执行必须保证数据的一致性;
  • I-Isolation: 隔离性,事务的执行必须保证数据的隔离性;
  • D-Durability: 持久性,事务的执行必须保证数据的持久性。

而事务隔离级别则是在大型数据库多个事务执行的过程中,针对事务并行进行的机制设计,主要是围绕Isolation进行设计的。

1. 三类问题

  1. 脏读
    • 过程:
      • 事务A正在写某一行数据,未提交;
      • 事务B并行读取该行数据,用于操作;
      • 事务A撤销写操作,这是对于事务B来说,之前的读操作就是错误的。
    • 读事务读取了写事务未提交的数据,而造成错误读取。
    • 举例
      • 小明今天发工资,一开始在财务系统上查询是工资50000元,很高兴地准备买新电脑,但是这是财务正在敲数据的时候一时疏忽,实际上工资只有5000元,财务在审核数据准备提交的时候发现了这个错误并修改过来,小明很失望。
      • 这里的小明就是读事务,财务就是写事务
  2. 不可重复读
    • 过程:
      • 事务B读取的是数据库中的某一行数据,用于操作;
      • 事务A开始对这行数据进行写操作并完成,数据库的数据改变;
      • 事务B再次读该数据库的这一行数据,发现数据改变;
    • 读事务两次读同一行数据,但是两次读取的数据并不一致。
    • 举例
      • 小明和小红打赌,这个月工资是1k,两个人几乎同时发出查询请求,但是小明先读取到了原始数据是1k,而财务核对之后再次修改了工资为2k,小红在这之后才并发读取到工资是2k,两人认为读操作是并行的,同时进行,虽然知道这中间可能是财务进行了修改,但是两人都认为自己读取的才是最终数据,因此吵了起来。
  3. 幻读
    • 过程
      • 事务B读取数据库中的一批数据,用于操作;
      • 事务A添加了一行数据,并完成操作,数据库的数据改变;
      • 事务B再次读该数据库的数据,发现这一批数据改变;
    • 读事务两次读取同一行数据,但是两次读取的数据不一致。(这和不可重复读操作是一致的)。
    • 举例
      • 小明被领导要求,改动财务系统上的ID数据格式,从A格式全都转为B格式,小明读取数据库中的数据之后开始修改,这时候,财务发现新来了一位员工叫小红,于是把小红的记录添加在财务系统上,ID格式依然是A格式。小明工作完成之后给领导看,领导却发现有一个人的数据没有改过来,很是恼火,把小明批评了一番。
    • 幻读和不可重复读的区别
      • 幻读是针对同一批数据,不可重复读针对的是同一行数据

2. 事务隔离级别

  1. 读未提交(read uncommitted)
  • 一个事务在写某一行数据的时候,允许其他事务并行读取该行数据,但是不允许写该行数据;
  • 允许多个事务并行读取数据库中的数据,但是不允许并行写入某一行数据;
  • 可能会出现脏读:
  • 解决方案:排他锁
  1. 读已提交(read committed)

    • 一个事务在写某一行数据的时候,不允许其他事务读或者写该行数据;
    • 允许多个事务并行读取数据库的数据;
    • 可能都造成不可重复读
  2. 可重复读(repeatable read)

    • 一个事务在读数据的时候,其他事务不允许写,可以读。
    • 一个事务在写数据的时候,其他事务不可以读或者写。
    • 可能会造成幻读
    • MySQL默认的隔离级别。
  3. 串行化(serializable)

    • 一个事务一个事务串行执行,不允许任何事物并行;
    • 能够解决幻读不可重复读脏读的问题;
    • 成本高,一般不适用

3. 操作指令

  1. 查看当前的隔离级别
    SELECT @@tx_isolation;
    
  2. 设置隔离级别
     set  [glogal | session]  transaction isolation level 隔离级别名称;//方式1
     set tx_isolation='隔离级别名称';//方式2
    ``
    

4. 总结

对前期的事务隔离级别做一个表格梳理
img

5. 参考博文

  1. 参考博文-1
  2. 参考博文-2

与【后端面经-数据库】MySQL的事务隔离级别简介相似的内容:

【后端面经-数据库】MySQL的事务隔离级别简介

对于数据库常用的事务隔离级别进行解释和区分,并解释三类读取错误——脏读、不可重复读、幻读的区别。

【后端面经-数据库】MySQL的存储引擎简介

对于mysql中常用的四类存储引擎MyISAM、InnoDB、MEMORY、MERGE的介绍和性能对比。

【后端面经】MySQL主键、唯一索引、联合索引的区别和作用

本文介绍了MySQL中主键、唯一索引、联合索引的特点和区别,并且介绍了“索引”对于数据库操作的影响。

【后端面经-数据库】Redis详解——Redis基本概念和特点

Redis一直是后端面试的热门提问点,是“兵家必争之地”,本文是Redis详解系列的第一部分,介绍了Redis的基本概念,并辅以面试题进行知识点巩固。

【后端面经-数据库】Redis数据结构和底层数据类型

本文介绍了Redis中数据结构相关知识,包括基本数据结构、特殊数据结构和底层数据结构。

【后端面经-Java】Java创建线程的方法简介

本文简要介绍了java中创建线程的四种方式,并介绍了线程概念,适合新手阅读。

【后端面经-java】java线程池满的处理策略

本文对java线程池做了具体介绍,并且讨论了java线程池满了之后的拒绝策略。

【后端面经-Spring】Spring 中 bean 的生命周期)

本文简单介绍了spring中bean的生命周期

【后端面经-Java】HashMap详解

本文详细介绍了hashmap,包括基本概念、hashmap数据结构、关键变量和重要方法,并且结合源码进行分析。

【后端面经-Java】Synchronize和ReentrantLock区别

本文介绍了Synchronize和ReentrantLock同步锁的相似和不同点,并指出两者的主要特点和适用场景。