三分钟图解事务隔离级别

2023-09-14 20:30:56

详细见:

“锁" 是数据库系统区别于文件系统的一个关键特性,其对象是事务,用来锁定的是数据库中的对象,如表、页、行等。锁确实提高了并发性,但是却不可避免地存在一些潜在的并发一致性问题。

不过好在锁只会带来四种问题(丢失更新、脏读、不可重复读、幻读),如果可以防止这四种情况的发生,那将不会产生并发异常。为此,ISO 和 ANIS SQL 标准制定了四种事务隔离级别标准,用来对应地解决锁带来的几种问题。

1.事务概念

事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);

事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务。事务一般都是与数据库打交道的操作.

事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。

2.事务的四大特性

1 )原子性
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
2 )一致性
事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。
3 )隔离性
一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4 )持续性
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

3.事务的隔离级别

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。

  1. 读未提交(Read Uncommitted)
    引发脏读(读取了未提交的数据)

  2. 读已提交(Read Committed)
    这是大多数数据库系统默认的隔离级别,但不是MySQL默认的
    只能看见已经提交事务所做的改变
    引发不可重复读,不可重读读意味着我们同一事务执行完全相同的select语句时可能看到不一样的结果。
    导致这种情况的原因可能有:(1)有一个交叉的事务有新的commit,导致了数据的改变;(2)一个数据库被多个实例操作时,同一事务的其他实例在该实例处理其间可能会有新的commit
    多个commit提交时,只读一次出现结果不一致

  3. 可重复读(Repeatable Read)
    这是MySQL的默认事务隔离级别
    它确保同一事务的多个实例在并发读取数据时,看到同样的数据行
    此级别可能出现的问题–幻读(Phantom Read),当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行
    InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题

  4. 可串行化(Serializable)
    这是最高的隔离级别
    它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它在每个读的数据行上加上共享锁。
    可能导致大量的超时现象和锁竞争

3.事务隔离级别

SQL 标准定义了四种越来越严格的事务隔离级别,用来解决我们上述所说的四种事务的并发一致性问题。

  1. READ UNCOMMITTED 读取未提交:事务中的修改,即使没有提交,对其它事务也是可见的。
    上面提到过,数据库本身其实已经具备阻止丢失更新的能力,也就是说,即使是最低的隔离级别也可以阻止丢失更新问题。所以:
    这个隔离级别可以阻止 丢失更新

  2. READ COMMITTED 读取已提交:一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的。
    这个隔离级别可以阻止 丢失更新 + 脏读

  3. REPEATABLE READ 可重复读(InnoDB 存储引擎默认的隔离级别):保证在同一个事务中多次读取同一数据的结果是一样的
    这个隔离级别可以阻止 丢失更新 + 脏读 + 不可重复读

  4. SERIALIZABL 可串行化:强制事务串行执行(需要使用锁机制来实现),这样多个事务互不干扰,不会出现并发一致性问题。
    这个隔离级别可以阻止 丢失更新 + 脏读 + 不可重复读 + 幻读

在这里插入图片描述

可以看到四种隔离级别能阻止的并发一致性问题越来越多,但并不代表越高的隔离级别就越好,因为事务隔离级别越高,数据库付出的性能代价也就相应地越大。

更多推荐

spark 数据倾斜优化总结

一、数据倾斜产生原因数据倾斜就是部分task承担了过多的计算任务,导致整个stage都被卡。可能产生数据倾斜的场景如下操作场景join其中一个表比较小,但key值少join大表与大表,但key值中存在过多的特殊值,如0或nulljoinon条件包含key值过滤逻辑,导致部分数据被保留,部分被过滤,最终节点分布不均joi

2023_Spark_实验七:Scala函数式编程部分演示

1、Scala中的函数在Scala中,函数是“头等公民”,就和数字一样。可以在变量中存放函数,即:将函数作为变量的值(值函数)。defmyFun1(name:String):String="Hello"+nameprintln(myFun1("Tom"))defmyFun2():String="HelloWorld"/

大数据-kafka学习笔记

KafkaKafka是一个分布式的基于发布/订阅模式的消息队列(MessageQueue),主要应用于大数据实时处理领域。Kafka可以用作Flink应用程序的数据源。Flink可以轻松地从一个或多个Kafka主题中消费数据流。这意味着您可以使用Kafka来捕获和传输实时数据,并将其发送到Flink进行进一步处理。Fl

创建第一个MyBatis框架--保姆级教学

文章目录前言一、创建一个空的mybatis项目二、创建一个Maven模块三、各个文件的配置四、总结前言在idea上创建我的第一个MyBatis框架一、创建一个空的mybatis项目1、new一个新的项目2、选择最下面,创建一个空项目3、为空项目取一个名字,位置可以自己选4、点击完成后,开始配置以下版本,两个版本得一样,

HDMI字符显示实验

FPGA教程学习第十五章HDMI字符显示实验文章目录FPGA教程学习前言实验原理程序设计像素点坐标模块字符叠加模块实验结果知识点总结前言在HDMI输出彩条的基础上输出osd叠加信息。实验原理实验通过字符转换工具将字符转换为16进制coe文件存放到单端口的ROMIP核中,再从ROM中把转换后的数据读取出来显示到HDMI上

高云FPGA系列教程(9):cmd-parser串口命令解析器移植

文章目录@[toc]cmd-parser库简介cmd-parser库源码获取GW1NSR-4C移植cmd-parser实际测试cmd-parse命令解析器优化本文是高云FPGA系列教程的第9篇文章。上一篇文章介绍片上ARMCortex-M3硬核处理器串口外设的使用,演示轮询方式和中断方式接收串口数据,并进行回环测试。本

千兆以太网硬件设计及链路层 MAC 协议格式

以太网系列文章:(1)千兆以太网硬件设计及链路层MAC协议格式(2)千兆以太网网络层ARP协议的原理与FPGA实现(3)CRC校验代码原理文章目录前言一、以太网MAC层接口介绍1.MII接口2.GMII接口3.RGMII接口二、以太网(MAC)帧协议介绍前言从本章开始,将分享千兆以太网设计的相关知识。将为大家分享千兆以

基于FPGA的图像sobel锐化实现,包括tb测试文件和MATLAB辅助验证

目录1.算法运行效果图预览2.算法运行软件版本3.部分核心程序4.算法理论概述5.算法完整程序工程1.算法运行效果图预览将FPGA的仿真结果导入到matlab显示图像效果2.算法运行软件版本MATLAB2022a,vivado2019.23.部分核心程序.................................

【洛谷 P1364】医院设置 题解(图论+深度优先搜索)

医院设置题目描述设有一棵二叉树,如图:其中,圈中的数字表示结点中居民的人口。圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接点之间的距离为111。如上图中,若医院建在111处,则距离和=4+12+2×20+2×40=136=4+12+2\times20+2\ti

分布式调度 Elastic-job

分布式调度Elastic-job1.概述1.1什么是任务调度我们可以思考一下下面业务场景的解决方案:某电商平台需要每天上午10点,下午3点,晚上8点发放一批优惠券某银行系统需要在信用卡到期还款日的前三天进行短信提醒某财务系统需要在每天凌晨0:10分结算前一天的财务数据,统计汇总以上场景就是任务调度所需要解决的问题任务调

“混合”引擎为通用子模块提供动力,实现嵌入式I / O灵活性

现成的组件对于嵌入式开发工程师而言并不是什么新鲜事物。但是,实际上没有人期望一种“一刀切”的解决方案,尤其是在涉及复杂的I/O要求的情况下。但是,基于流行的夹层卡格式的具有成本效益的现场可编程门阵列(FPGA)技术的新实现正在“针对VME,PCI,CompactPCI和VME提供可承受的标准硬件和自由形式的I/O多功能

热文推荐