MVCC

什么是mvcc

multi-version concurrency contrl 多版本并发控制
InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读

当前读和快照读

  • 当前读:读取的是记录的最新版本,对读取进行加锁保证其他并发事务不修改当前记录
  • 快照度:基于多版本,读到数据可能不是最近版本

mvcc能解决什么问题

  • 读-读
    不需要并发控制
  • 读-写
    有线程安全问题,会造成事务隔离性问题,可能会遇到脏读,幻读,不可重复度
    1.脏读

    A对数据进行写操作,B仅对数据进行读操作。A对数据写入,写入后事务出现故障,需要回滚,但在回滚前恰好B读取了数据,这个时候B读取的数据属于临时数据,由于A的事务需要回滚,所以B读取的数据并不会被保存到数据库,造成读取错误数据的现象。
    假如初始数据是1,A对其修改为2,B在A出现故障前读取到B修改的数据2,但是A事务出现故障,需要回滚,回滚到原来的1,这时候B读取的2就是错误的数据,这就是脏读。
    2.幻读

    A读取数据库中的数据,B在A读取过程中操作数据,A读到的是部分更新前和部分更新后的数据,这样进行求和操作的时候,出现的是不完全更新的数据。
    3.不可重复读
    幻读是说数据的条数发生了变化,原本不存在的数据存在了。不可重复读是说数据的内容发生了变化,原本存在的数据的内容发生了改变。
  • 写-写
    有线程安全问题,可能存在数据丢失问题

    AB均对数据库的数据进行先读后写的操作。B先读取数据库,进行处理,这时,A也读取数据,处理后接着写入数据。B处理结束,再次写入数据。A的写入会被覆盖掉,这叫做更新丢失。
    假设最初数据是2,A和B读取的都是2,A对数据减操作,2-2=0,写入数据变成了0,B接着写入数据,对数据进行加5,2+5=7,最后的结果变成了7.然而,本该出现的是2-2+5=5.结果A对数据的操作丢失了。这叫数据更新丢失。
posted @ 2022-12-12 08:53  braveman1021  阅读(44)  评论(0)    收藏  举报