MySQL高阶知识点(一)事务的并发问题和隔离级别

这篇具有很好参考价值的文章主要介绍了MySQL高阶知识点(一)事务的并发问题和隔离级别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。

在 MySQL 中,事务支持是在引擎层实现的。

MySQL 是一个支持多引擎的系统,但并不是所有的引擎都支持事务。

如 MySQL 原生的 MyISAM 引擎就不支持事务,这也是 MyISAM 被 InnoDB 取代的重要原因之一。

事务的四大特性(ACID)

  • 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;

  • 一致性: 执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;

  • 隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;

  • 持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响

事务的并发问题

  • 脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。

  • 丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。 例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。

  • 不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。

  • 幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

不可重复度和幻读区别:

不可重复读的重点是修改,针对的数据是多行。
幻读的重点在于新增或者删除,针对数据是多行。

事务的隔离级别

SQL 标准定义了四个隔离级别:

  • READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
  • READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
  • REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
  • SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读,RR),
Oracle和sql server的默认隔离级别是READ-COMMITTED(读取已提交,RC)。

我们可以通过

SELECT @@tx_isolation;

命令来查看,MySQL 8.0 该命令改为

SELECT @@transaction_isolation;

MySQL InnoDB 的 REPEATABLE-READ(可重读)并不保证避免幻读,需要应用使用加锁读来保证。
而这个加锁度使用到的机制就是 Next-Key Locks。

因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是 READ-COMMITTED(读取提交内容) ,但是你要知道的是 InnoDB 存储引擎默认使用 REPEATABLE-READ(可重读,RR) 并不会有任何性能损失

事务隔离的实现

在实现上,数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准。

  • 在“可重复读”隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。
  • 在“读提交”隔离级别下,这个视图是在每个 SQL 语句开始执行的时候创建的。
  • 这里需要注意的是,“读未提交”隔离级别下直接返回记录上的最新值,没有视图概念;
  • 而“串行化”隔离级别下直接用加锁的方式来避免并行访问。

每条记录在更新的时候都会同时记录一条回滚操作。
同一条记录在系统中可以存在多个版本,这就是数据库的多版本并发控制(MVCC)

回滚日志什么时候删除?

系统会判断当没有事务需要用到这些回滚日志的时候,回滚日志会被删除。

什么时候不需要了?

当系统里么有比这个回滚日志更早的read-view的时候。

为什么尽量不要使用长事务?

长事务意味着系统里面会存在很老的事务视图,在这个事务提交之前,回滚记录都要保留,这会导致大量占用存储空间
除此之外,长事务还占用锁资源,可能会拖垮库。文章来源地址https://www.toymoban.com/news/detail-651502.html

到了这里,关于MySQL高阶知识点(一)事务的并发问题和隔离级别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【并发知识点】CAS的实现原理及应用

    AQS的实现原理及应用 CAS的实现原理及应用 本章节介绍CAS概念、实现原理,并通过java代码应用,最终模拟赛龙舟比赛。 CAS的全称为:CompareAndSwap,直译为对比和交换。 CAS实际是普遍处理器都支持的一条指令,这条指令通过判断当前内存值V、旧的预期值A、即将更新的值B是否相

    2024年02月10日
    浏览(34)
  • 【C语言高阶篇】C语言面试必考知识点,结构体的内存对齐我看还有谁不会!

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,今天给大家带来的是结构体的内存对齐这部分知识,可以说是干货满满啦!    ⛳️ 在我们C语言的面试题中,结构体最

    2024年02月16日
    浏览(35)
  • ad+硬件每日学习十个知识点(25)23.8.5(常见芯片类型、数字隔离芯片、IO扩展芯片TCAL6416)

    答: 模数转换器(Analog-to-Digital Converter,ADC):模数转换器将模拟信号转换为数字信号,常用于测量和采集模拟传感器数据,并将其转换为数字形式供处理和分析。 数模转换器(Digital-to-Analog Converter,DAC):数模转换器将数字信号转换为模拟信号,常用于音频设备、通信系

    2024年02月14日
    浏览(34)
  • ad+硬件每日学习十个知识点(26)23.8.6 (DCDC的降压电路、升压电路、降压-升压电路,同步整流,选型考虑同步、隔离)

    答:这里开关是MOS管还是三极管都可以,主要是凭借PWM波进行通断控制,当输出比输入小的时候,Vo=Vin*占空比,比如输入12V,想要输出3V,那就把占空比调成四分之一。 电感是用来在开关断开的时候,输出电流,电容是为了让变化变缓,这时候走的是电感-电阻-二极管的回路

    2024年02月12日
    浏览(35)
  • Mysql知识点汇总

    select distinct 列名 from 表名 where 查询条件表达式 group by 分组的列名 having 分组后的查询条件表达式 order by 排序的列名 ascdesc 升序降序 limit 查询的记录条数 每门课程大于80分——》最低分不小于80分 order by: 用于排序,默认是升序排序 后面用用asc或者desc order by 后面跟

    2024年02月19日
    浏览(28)
  • Mysql知识点整理

    什么是Mysql; Mysql常用的存储引擎有什么?它们有什么区别? 数据库的三大范式; Mysql的数据类型有哪些? Mysql的索引: 什么是Mysql索引? 索引的优缺点 索引的数据结构 Hash索引和B+树索引的区别 索引类型有哪些? 索引的种类有哪些? B树和B+树的区别? 数据库为什么使用

    2023年04月12日
    浏览(31)
  • mysql知识点梳理

    1.检查是否走了索引,如果没有则优化SQL利用索引 2.检查所利用的索引,是否是最优索引 3.检查所查字段是否都是必须的,是否查询了过多字段,查出了多余数据;查询太多的字段会回表 4.检查表中数据是否过多,是否应该进行分库分表了 5.检查数据库实例所在机器的性能配

    2024年04月12日
    浏览(26)
  • MySQL常考知识点

    作者: 逍遥Sean 简介:一个主修Java的Web网站游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有需要我的支持,请私信或评论留言! 索引⽤来快速地寻找那些具有特定值的记录。如果没有索引,⼀般来说执⾏查询时遍历整

    2024年02月07日
    浏览(25)
  • 【MySQL知识点】自动增长

    🙋‍ 哈喽大家好,本次是MySQL数据库原理系列第八期 ⭐本期是MySQL的表的约束——自动增长 🏆系列专栏:MySQL数据库 😄还请大家多多指教呀~ 👍欢迎大佬指正,一起学习,一起加油! 利用MySQL提供的自动增长功能来自动生成主键的值,防止插入的值重复导致插入失败。自动

    2024年02月05日
    浏览(26)
  • mysql innodb一些知识点

    1、事务和锁的关系; 在MySQL事务中,只要开始了一次事务,就会自动加上一个共享锁(Shared Lock)。这个锁会在事务结束时自动释放。如果在事务中需要更新某个数据对象,那么MySQL会将该数据对象的共享锁升级为排他锁(Exclusive Lock),这可以确保在其他事务中对该数据对象

    2024年02月14日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包