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