-
假如一个学校正在考试 学生甲在答题 学生乙在偷瞄 此时甲写了一个答案还没有写完 然后乙就偷看了甲的答案然后写在了自己的试卷上 这是乙的读操作就造成了脏读
-
用到事务上来说就是 事务A还没有完全提交 事务B就读取了数据 就造成了脏读
-
如何解决脏读:
-
给写操作加锁 就是学生甲在答这道题的时候 学生乙不可以看 知道学生甲写完这道题 学生乙才可以看
-
事务上来说就是在事务A完全提交之前 事务B去读数据就会阻塞 一直阻塞到A提交数据之后 B才能读取数据
-
引入写加锁 事务的并发程度就降低了 效率降低了 隔离性提高了
-
还是刚刚那个考试的例子 学生甲在写一道数学大题 学生乙在偷瞄 学生乙偷瞄一眼后 然后赶快将答案写在了自己的卷子上 可是在乙写的时候 甲发现自己有更好的解法就把答案全擦了 重新写了 等到乙再去看第二眼的时候 发现我靠怎么完全不一样了 乙就陷入了迷惑之中 乙这就造成了不可重复读问题
-
解决方法
-
再给读加锁 就好比学生乙在偷瞄答案的时候甲是不可以更改的
-
在事务上说就是事务B在读数据的时候 事务A不能写了 此时也就解决了不可重复读问题
-
引入读加锁 事务的并发程度就更低了 效率也低了 隔离性就更加高了
-
我们给写 和读 都加锁之后解决了脏读和 不可重复读问题 但是还会有幻读问题
-
幻读就好比 学生乙在偷瞄学生甲的大题 而此时学生甲还在写未完成的题 所以对 学生乙来说 他得到的整张试卷和学生甲还是不一样的
-
事务上来说就是 同一个事务中 俩次读取到的结果集不一致 虽然读加锁了 读的时候不能改改 但是还是可以增加和删除记录 所以是得到的结果集会不一样
-
解决方案:
-
如果要解决这个问题就必须严格的进行串行化执行
======================================================================
-
隔离性就是让多个事务并发执行时,事务之间不能相互干扰 本质上就是为了线程安全
-
隔离和并发是相悖的 隔离是为了保证数据的准确 并发是为了提高事务的执行效率
-
如果多个事务之间的隔离性越强 并发程度就会越低 效率就会降低
-
如果多个事务之间隔离性越弱 并发执行程度就会越高 效率就会越高
-
所以为什么要引入隔离性?
虽然俩者是相悖的 但是在不同场景下 对于数据的准确性要求不一样 就可以引入隔离不同的隔离等级 尽可能既提高并发性 有可以保证准确性
=========================================================================
- 对隔离性的要求具体多高就使用哪个隔离级别 (隔离高了 并发程度流低了 数据的可靠性高了 效率低了)
-
允许读取未提交的数据
-
隔离程度最低 并发最高 但会有脏读问题
-
只允许读取已提交的数据 相当于给写加锁
-
隔离性提高了一些 并发性降低了一些 解决了脏读问题 但是会有不可重复读问题
-
MySQL的默认隔离级别
-
给读也加了锁
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618164986)
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!