码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Mysql事务的隔离级别——关于脏读、幻读、可重复读


    目录

    • 一、事务
      • (一)什么是事务
      • (二)事务的特征
      • (三)手动开启、提交、回滚事务
    • 二、脏读、幻读、可重复读
      • (一)脏读 read uncommit
      • (二)不可重复读 unrepeatable
      • (三)幻读
      • (四)不可重复读和幻读的区别
    • 三、事务的隔离级别
      • (一)读未提交read uncommitted
      • (二)读已提交read committed
      • (三)不可重复读 read repeatable
      • (四)序列化 serializable

    因为InnoDB是支持事务的,所以只对InnoDB的事务进行讨论。

    一、事务

    (一)什么是事务

    事务是由一组SQL语句组成的逻辑处理单元,是一组不可分割的操作序列。

    (二)事务的特征

    1. 原子性(Actomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
    2. 一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。
    3. 隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。
    4. 持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。

    (三)手动开启、提交、回滚事务

    -- 开启事务
    start transaction;
    update user_count set balance = balance + 20 where id = 1;
    update user_count set balance = balance - 20 where id =2;
    -- 回滚事务
    rollback;
    -- 提交事务
    commit;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意:在回滚和提交之前,数据库中的数据都是操作的缓存中的数据,而不是数据库中的真实数据。

    二、脏读、幻读、可重复读

    (一)脏读 read uncommit

    读取到了未提交的数据。

    脏读对应的是read uncommitted读未提交的事务隔离级别,即从缓存中读取数据,而不是读取已经持久化的数据。

    事务B在select的时候,读取到了被事务A更新在缓存的数据,但是该数据没有真正的持久化到数据库中,一旦事务A会滚,事务B就会读到错误的脏数据。

    在这里插入图片描述

    (二)不可重复读 unrepeatable

    一个事务在读取某些数据已经发生了改变、或某些记录已经被删除了!这种现象叫做“不可重复读”。

    不可重复读产生的场景对应的是read committed读已提交的事务隔离级别,即事务读取的数据都是已经完成持久化的数据。

    在这里插入图片描述

    (三)幻读

    同一事务内,同样的筛选条件,查询出来的数据条数发生了变化,(另一个事务抢到CPU进行了删除或者插入条件),这种现象就称为“幻读” 。
    幻读产生的场景对应的是repeatable read可重复读的事务隔离级别,事务读取的数据都是已经完成持久化的数据,并且为事务在修改的数据增加行锁,但是没有表锁。

    在这里插入图片描述

    (四)不可重复读和幻读的区别

    不可重复读针对的是同一条数据,读的是别的事务修改之前的样子,一旦事务的隔离级别使用了unrepeatable read,加上行锁,就可以避免产生。
    幻读针对的是满足筛选条件的一批数据,因为行锁不能阻止插入和删除数据,所以会导致查询到的条数是错误的,使用serializable可以避免。

    三、事务的隔离级别

    脏读不可重复读幻读
    read uncommitted√√√
    read committed√√
    repeatable read√
    serializable

    设置表的隔离级别sql语言如下:

    -- 查询数据库当前的隔离级别
    select @@transaction_isolation
    -- 读未提交
    set session transaction isolation level read uncommitted;
    -- 读已提交
    set session transaction isolation level read committed;
    -- 不可重复读
    set session transaction isolation level repeatable read;
    -- 序列化(串行执行)
    set session transaction isolation level serializable;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    (一)读未提交read uncommitted

    读缓存里面的数据,风险最高但是允许的并发最多

    (二)读已提交read committed

    读持久化的数据,不读缓存的数据,不加锁

    (三)不可重复读 read repeatable

    读可持久化的数据的数据,并且添加行级锁(一个事务在修改某行数据的时候,别的事务阻塞等待提交才能读到)

    (四)序列化 serializable

    最安全但是并发效率最低,读持久化数据,并且加表锁,如果事务并发的多,需要一直阻塞,不建议使用。

    事务的隔离级别从低到高依次是 read uncommitted , read committed, repeatable read , serializable 。隔离级别越低,越能支持高并发的数据操作,与此同时,也会带来越高的并发风险,Mysql数据库默认的隔离级别是repeatable read 。

  • 相关阅读:
    基于物联网的室内环境检测云系统设计(树莓派RPI、Arduino、智能家居、RFID、APP)
    29、域名ICP备案查询API接口,免费好用
    基于Matlab实现多个数字水印案例(附上源码+数据集)
    数据库事务基本概念介绍
    【解决方案】Ubuntu20.04 LTS CUDA已经安装但nvcc -V显示command not found
    Acrel-1200分布式光伏运维平台
    java毕业设计成都某4S店销售管理系统Mybatis+系统+数据库+调试部署
    VirtualBox配置Centos7双网卡固定IP
    Nodejs的Express之同路由HEAD请求却执行GET函数问题
    [word] Word如何删除所有的空行? #职场发展#学习方法
  • 原文地址:https://blog.csdn.net/weixin_44712778/article/details/126487673
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号