MySQL~详细介绍事务的一个重要特性--隔离性 (解决脏读、不可重复读、幻读)

介绍脏读、不可重复读、幻读

脏读

  • 假如一个学校正在考试 学生甲在答题 学生乙在偷瞄 此时甲写了一个答案还没有写完 然后乙就偷看了甲的答案然后写在了自己的试卷上 这是乙的读操作就造成了脏读
  • 用到事务上来说就是 事务A还没有完全提交 事务B就读取了数据 就造成了脏读
  • 如何解决脏读:
  • 给写操作加锁 就是学生甲在答这道题的时候 学生乙不可以看 知道学生甲写完这道题 学生乙才可以看
  • 事务上来说就是在事务A完全提交之前 事务B去读数据就会阻塞 一直阻塞到A提交数据之后 B才能读取数据
  • 引入写加锁 事务的并发程度就降低了 效率降低了 隔离性提高了

不可重复读

  • 还是刚刚那个考试的例子 学生甲在写一道数学大题 学生乙在偷瞄 学生乙偷瞄一眼后 然后赶快将答案写在了自己的卷子上 可是在乙写的时候 甲发现自己有更好的解法就把答案全擦了 重新写了 等到乙再去看第二眼的时候 发现我靠怎么完全不一样了 乙就陷入了迷惑之中 乙这就造成了不可重复读问题
  • 解决方法
  • 再给读加锁 就好比学生乙在偷瞄答案的时候甲是不可以更改的
  • 在事务上说就是事务B在读数据的时候 事务A不能写了 此时也就解决了不可重复读问题
  • 引入读加锁 事务的并发程度就更低了 效率也低了 隔离性就更加高了

幻读

  • 我们给写 和读 都加锁之后解决了脏读和 不可重复读问题 但是还会有幻读问题
  • 幻读就好比 学生乙在偷瞄学生甲的大题 而此时学生甲还在写未完成的题 所以对 学生乙来说 他得到的整张试卷和学生甲还是不一样的
  • 事务上来说就是 同一个事务中 俩次读取到的结果集不一致 虽然读加锁了 读的时候不能改改 但是还是可以增加和删除记录 所以是得到的结果集会不一样
  • 解决方案:
  • 如果要解决这个问题就必须严格的进行串行化执行

如何理解隔离性

  • 隔离性就是让多个事务并发执行时,事务之间不能相互干扰 本质上就是为了线程安全
  • 隔离和并发是相悖的 隔离是为了保证数据的准确 并发是为了提高事务的执行效率
  • 如果多个事务之间的隔离性越强 并发程度就会越低 效率就会降低
  • 如果多个事务之间隔离性越弱 并发执行程度就会越高 效率就会越高
  • 所以为什么要引入隔离性?
    虽然俩者是相悖的 但是在不同场景下 对于数据的准确性要求不一样 就可以引入隔离不同的隔离等级 尽可能既提高并发性 有可以保证准确性

MySQL的隔离级别

  • 对隔离性的要求具体多高就使用哪个隔离级别 (隔离高了 并发程度流低了 数据的可靠性高了 效率低了)

read uncommitted

  • 允许读取未提交的数据
  • 隔离程度最低 并发最高 但会有脏读问题

read committed

  • 只允许读取已提交的数据 相当于给写加锁
  • 隔离性提高了一些 并发性降低了一些 解决了脏读问题 但是会有不可重复读问题

repeatable read

  • MySQL的默认隔离级别
  • 给读也加了锁
  • 隔离性更高了一些 并发性降低了 解决了不可重复读问题 但是会有幻读问题

serializable

  • 严格执行串行化执行
  • 隔离性最高 并发性最低 解决了幻读问题

猜你喜欢

转载自blog.csdn.net/Shangxingya/article/details/106758443