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

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

时间:2023-06-14 18:33:35浏览次数:60  
标签:小明 事务 读取 简介 数据库 端面 MySQL 数据 隔离

目录

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,数据,隔离
From: https://www.cnblogs.com/CrazyPixel/p/17481063.html

相关文章

  • maven简介
    maven查询maven依赖版本信息地址:https://mvnrepository.com/管理庞大的jar包;构建项目(依赖、打包、部署);阿里云镜像仓库<mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexusaliyun</name><url>http://maven.ali......
  • CentOS环境下搭建seata(二进制、MySQL)
    seata官网:https://seata.io/zh-cn/。我在这里部署的seata版本是2.0.4。SpringCloudAlibaba版本对应组件版本说明,详细参考官网文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E。(1).初始化数据库首先要确......
  • mysql-主从数据一致性检查工具 pt-table-checksum
    pt-table-checksum工具介绍pt-table-checksum是PerconaToolkit的一个组件,用于检测MySQL主、从库的数据是否一致。它的原理是在主库执行基于statement的SQL语句来生成主库数据块的checksum,把相同的SQL语句传递到从库执行,并在从库上计算相同数据块的checksum,最后,比......
  • Scala简介和安装
    简介Scala是一种多范式的编程语言(多范式:多种编程方法的意思。有面向过程、面向对象、泛型、函数式四种程序设计方法),其设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序官网:https://www.scala-lang.org/Scala以一种......
  • MySQL GTID 主从复制错误修复方法
    MySQLGTID主从复制错误修复方法MySQL传统复制恢复方法:root@(none)>stopslave;QueryOK,0rowsaffected(0.00sec)root@(none)>SETGLOBALSQL_SLAVE_SKIP_COUNTER=N;#跳过N个事务QueryOK,0rowsaffected(0.00sec)root@(none)>startslave;QueryOK,......
  • docker 安装mysql-server
    ################查找mysql-server镜像:dockersearchmysql-server[root@igoodful~]#dockersearchmysql-serverINDEXNAMEDESCRIPTIONSTARSOFFICIALAUTOMATEDdocker.iodock......
  • MySQL基础:安装和启动
    MySQL基础:安装和启动课程安排基础篇介绍数据库相关概念SQL是操作关系型数据库的编程语言主流关系型数据库总结安装MySQL数据库MySQL数据库启动与停止默认mysql开机启动客户端连接方式1方式2需要配置环境变量......
  • 如何使用MySQL存储过程简化数据库操作
    在数据库管理领域,MySQL已成为最受欢迎和最可靠的选择之一。MySQL不仅提供了强大的数据存储能力,还提供了一种称为“过程”的强大功能,使开发人员能够简化复杂的数据库操作。在本教程中,我们将深入研究MySQL过程的概念并探索它们的好处。然后,我将提供有关如何有效使用它们的分步......
  • STM32之中断简介
    一、F407在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。其中系统异常10个,外部中断82个。除了个别异常的优先级被定死外,其他异常的优先级都是可以编程的。结构体:IRQn_Type包含全部异常声明。二、嵌套向量中断控制器NVIC,在STM32中NVIV是Cortex-M4的一......
  • Linux - MySQL修改临时密码并设置访问权限【Linux】
    1.查阅临时密码cat/var/log/mysqld.log|greppassword2.登录MySQL①.登录mysql(复制日志中的临时密码登录)mysql-uroot-p输入临时密码②.修改密码setglobalvalidate_password_length=4;设置密码长度最低位数setglobalvalidate......