Mysql 事务的四种隔离级别,并举例说明

请尝试在评论区里写下答案(如不能清楚表述,那么你可能没真正理解)。欢迎参与,为下一次求职做准备。

请用自己的语言描述出来,而非直接粘贴复制八股文,感谢 :100:

明天我们吃什么 悲哀藏在现实中 Tacks
讨论数量: 3

有四种隔离级别, 常用的是 rr,存在幻读的可能性,每种隔离级别解决1种常见问题。脏读,不可重复度,幻读。

最严格的级别可以避免幻读,但是有性能的问题(为什么影响性能未查资料)。

7个月前 评论
sbihgu 6个月前

在MySQL 中,事务隔离级别有四种,读未提交,读已提交,可重复度,串行化,分别隔离等级从低到高越来越严格,隔离等级越高,数据一致性就越好,但性能开销就大。


:rocket: :rocket: :rocket: MySQL 中,一般来说默认的就是可重复读,也就是我们常说的 rr 事务隔离级别。 :rocket: :rocket: :rocket:


  • 读未提交
    • 含义:在这个隔离级别下,A事务中可以看到其他事务未提交的数据;
    • 等级:隔离级别最低;
    • 问题:好家伙事务就是为了 ACID 特性,你直接读到别人没有提交的数据,岂不是虚晃一枪,没确定的事情就不要乱散布谣言,以讹传讹;基本上不会用的
    • 影响:读到别人没提交的数据也就是脏读, 脏了,脏了,别乱说话,做个正直的人!
  • 读已提交
    • 含义:该事务隔离级别下,当前事务只能读取其他事务已经提交的数据
    • 等级:隔离级别稍微高一些,至少解决了脏读
    • 问题:虽然是读取的已经提交的事务,但是比如某个事务需要开始读某个记录,但是被另一个事务修改了这个记录并且成功提交,那么再次读取这个记录就会造成前后数据不一致的情况,就会有点迷惑;
    • 影响:事务内,前后读取同一条记录的结果不同,也就是不可重复读
  • 可重复读
    • 含义:默认的事务隔离级别,保证在同一个事务内,多次读取数据集会得到相同的结果,及时其他事务在这个中间提交了修改更新
    • 等级:既保证性能,又保证可以重复读,就是好用哇,解决了脏读、不可重复读
    • 问题:虽然是默认隔离等级,但就没有问题吗,???大写的问号,如在同一个事务内执行两次相同的查询,结果行数不同,就是有可能中间有其他事务突然修改插了一脚,真是凌门一脚踢出来个 MVCC 解决方案,不然咋并发
    • 影响:那就是有可能造成幻读,幻读,迷幻哇,不就是迷惑了,比如在同一个事务中,原本读我的邮箱有100条记录,又读了一次变成200条了,就有点晕晕了,跟喝酒看重影一样
  • 串行化
    • 含义:串行化,顾名思义,通过强制事务串行执行,每次事务会在读取的每一行数据上加锁,确保其他事务不能同时进行修改、删除或插入操作
    • 等级:最最最严格的等级
    • 问题:效率低,事务变成串行了,数据库的并发性能就低下,而且引入了锁,对资源的消耗也上来了,说不定还有死锁的风险
    • 影响:数据一致性等级最高,但性能很低,基本上也不咋用。

那你就会问,MySQL 默认是可重复读,还有幻读的问题,我都不敢用了,放心, MVCC 多版本并发控制帮你解决,可以看下一题。

7个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!