码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【面试题 - mysql】事务


    事务

    • 事务
      • 1.事务四大特性(ACID,AID是手段,C是目的)
      • 2. 事务并发问题
        • 2.2.1 脏读
        • 2.2.2 不可重复读
        • 2.2.3 幻读
        • 2.2.4 不可重复读和幻读有什么区别
      • 3. 事务隔离级别
        • 3.1 MySQL 的隔离级别是基于锁实现的吗?
        • 3.2 MySQL 的默认隔离级别是什么?
        • 3.3 MySQL如何避免幻读
      • 4. 实际情况演示事务并发问题并解决
        • 4.1 脏读(读未提交)
        • 脏读(解决)
        • 4.2 不可重复读
        • 不可重复读(解决)
        • 4.3 幻读
        • 幻读(解决)

    事务

    事务是一组操作的集合,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

    1.事务四大特性(ACID,AID是手段,C是目的)

    原子性(Atomicity):事务是不可分割的最小操作但愿,要么全部成功,要么全部失败
    一致性(Consistency):事务完成时,必须使所有数据都保持一致状态
    隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
    持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

    只有保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。也就是说 A、I、D 是手段,C 是目的!
    在这里插入图片描述

    2. 事务并发问题

    脏读一个事务读到另一个事务还没提交的数据
    不可重复读一个事务先后读取同一条记录,但两次读取的数据不同
    幻读一个事务按照条件查询数据时,没有对应的数据行,但是再插入数据时,又发现这行数据已经存在

    2.2.1 脏读

    2.2.2 不可重复读

    在这里插入图片描述

    2.2.3 幻读

    在这里插入图片描述

    2.2.4 不可重复读和幻读有什么区别

    不可重复读的重点针对同一条记录发生了修改;
    幻读的重点在于条数发生变化。

    3. 事务隔离级别

    在这里插入图片描述

    3.1 MySQL 的隔离级别是基于锁实现的吗?

    MySQL 的隔离级别基于锁和 MVCC 机制共同实现的。

    3.2 MySQL 的默认隔离级别是什么?

    MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。

    3.3 MySQL如何避免幻读

    标准的 SQL 隔离级别定义里,REPEATABLE-READ(可重复读)是不可以防止幻读的。
    但是!InnoDB 实现的 REPEATABLE-READ 隔离级别其实是可以解决幻读问题发生的,主要有下面两种情况:

    快照读 :由 MVCC 机制来保证不出现幻读。
    当前读 :使用 Next-Key Lock 进行加锁来保证不出现幻读,Next-Key Lock 是行锁(Record Lock)和间隙锁(Gap Lock)的结合,行锁只能锁住已经存在的行,为了避免插入新行,需要依赖间隙锁。

    4. 实际情况演示事务并发问题并解决

    4.1 脏读(读未提交)

    在这里插入图片描述

    脏读(解决)

    在这里插入图片描述

    4.2 不可重复读

    还是刚才上面的读已提交的图,虽然避免了读未提交,但是却出现了,一个事务还没有结束,就发生了 不可重复读问题。
    在这里插入图片描述

    不可重复读(解决)

    在这里插入图片描述

    4.3 幻读

    SQL 脚本 1 在第一次查询工资为 500 的记录时只有一条,SQL 脚本 2 插入了一条工资为 500 的记录,提交之后;SQL 脚本 1 在同一个事务中再次使用当前读查询发现出现了两条工资为 500 的记录这种就是幻读。
    在这里插入图片描述

    幻读(解决)

    解决幻读的方式有很多,但是它们的核心思想就是一个事务在操作某张表数据的时候,另外一个事务不允许新增或者删除这张表中的数据了。解决幻读的方式主要有以下几种:

    将事务隔离级别调整为 SERIALIZABLE 。
    在可重复读的事务级别下,给事务操作的这张表添加表锁。
    在可重复读的事务级别下,给事务操作的这张表添加 Next-key Lock(Record Lock+Gap Lock)。

    来源:https://javaguide.cn/database/mysql/transaction-isolation-level.html#%E5%B9%BB%E8%AF%BB
    https://www.bilibili.com/video/BV1Kr4y1i7ru?p=195&spm_id_from=333.880.my_history.page.click&vd_source=b901ef0e9ed712b24882863596eab0ca

  • 相关阅读:
    【MySQL】MySQL数据类型
    自监督直接和具体任务的结合(Task Related Self-Supervised Learning)的探索
    酶联试剂抗体抗原 ——博迈伦
    java毕业设计大众采编本微资讯发布平台(附源码、数据库)
    kotlin协程广播管道BroadcastChannel,订阅管道openSubscription
    微服务系统设计——数据模型与系统架构设计
    Linux操作系统
    第1章丨我心光明
    更改 npm的默认缓存地址
    235. 二叉搜索树的最近公共祖先
  • 原文地址:https://blog.csdn.net/yzx3105/article/details/126765062
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号