MVCCduo

全称Multi-Version Concurrency Control,即多版本并发控制

1.数据库数据会产生什么问题

  1. 脏读:一个事务读取了另一个事务未提交的数据
  2. 不可重复读:同一个事务中读取同一个数据会有不同的结果
  3. 幻读:针对插入来说的,事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据 称为幻读
    如果事务A 按一定条件搜索, 期间事务B 删除了符合条件的某一条数据,导致事务A 再次读取时数据少了一条。这种情况归为 不可重复读

2. 事务的隔离级别

在数据库中存在4中事务的隔离级别:

  1. Read uncommitted 读未提交:这种事务隔离级别最低,三种问题都不可解决,
  2. Read committed 简称 RC读提交:解决了脏读问题,在读的时候读取的是已经提交的事务的数据,对于未提交的事务数据是不会读取的。
  3. Repeatable read 简称RR 可重复读:解决了在同一个数据中前后读取同一个条数据的时候不会有不同的结果。
  4. SERIALIZABLE(可串行化) :完全符合ACID原则,同时解决了幻读的问题。

3. ACID原则

  1. 原子性(A)
    一个事务的所有系列操作步骤被看成一个动作,所有的步骤要么全部完成,要么一个也不会完成。如果在事务过程中发生错误,则会回滚到事务开始前的状态,将要被改变的数据库记录不会被改变。
  2. 一致性(C)
    一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏,即数据库事务不能破坏关系数据的完整性及业务逻辑上的一致性。
  3. 隔离性(I)
    主要用于实现并发控制,隔离能够确保并发执行的事务按顺序一个接一个地执行。通过隔离,一个未完成事务不会影响另外一个未完成事务。
  4. 持久性(D)
    一旦一个事务被提交,它应该持久保存,不会因为与其他操作冲突而取消这个事务。

4. MVCC

多版本并发控制是为了解决数据库并发读写的性能问题,即使在读写冲突的时候也不用加锁,其中四种事务隔离级别中RR与RC使用了MVCC。
在MVCC中最重要是undolog,和Read View(读视图),每一条数据都有一个undo 日志,日志中有指向上一个版本的指针,读视图中有三个属性:1.当前系统活跃事务的版本号(未提交的事务)2.当前系统事务的最大版本号+1 3.当前系统的活跃事务的最小版本号,如果当前事务ID小于或者等于ReadView中最小活跃事务的版本号那么该数据就是在当前数据之前创建或者此事务创建,那么可以显示,如果大于等于那么数据是在ReadView创建之后生成,不予显示。
image
参考:https://www.php.cn/mysql-tutorials-460111.html

posted @ 2021-09-06 16:34  LiangLiangAA  阅读(28)  评论(0编辑  收藏  举报
theme: { name: 'geek', avatar: '', headerBackground: '' // ... },