**前言:**本节内容是事务里面最难的一部分, 就是理解mvcc快照读和read view。这两个部分需要了解隔离性里面的四种隔离级别。 博主之前讲过,但是担心友友们不了解, 所以这里开头进行了复习。 下面开始我们的学习吧!
ps:本节内容很难, 希望友友们沉下心认真学习哦!
目录
我们先来回忆一下上接内容讲解的隔离性的四种隔离级别, 以及并发产生的问题:
- 脏读:一个事务在执行中,读到另一个事务的更新但是还没有commit的数据, 这种情况叫做脏读。
- 不可重复读:一个事务提交前和提交后, 另一个事务select查到的数据结果是不一样的。 也就是说一个事务一直select, 结果某一次select的时候, 数据突然变了。
- 幻读:读者读者可能多出来了一条数据,就类似于出现了幻觉。
- 读未提交: 会导致脏读,不可重复读, 幻读现象。
- 读提交 :解决了脏读, 但是有不可重复读, 幻读。
- 可重复单独: 解决了脏读, 不可重复读, 但是有些数据库的insert会有幻读现象(mysql解决了幻读)
- 串行化:加锁, 不进行并发执行, 没有上面的问题。
一致性
事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库只包含事务成功提交的结果时,数据库处于一种一致性状态。如果系统运行发生中断,某个事务尚未完成而被迫中断,而改变未完成的事务对数据库所做的修改已被写入数据库,此时数据库就处于一种不正确的状态。因此一致性是通过原子性保证的。
三种并发方式的安全隐患
- 读读并发:不存在任何问题,不需要并发控制。
- 读写并发:有线程安全问题,可能造成事务隔离性问题可能遇到脏读,幻读,不可重复读
- 写写并发:有线程安全问题,可能会存在更新丢失问题,比如