临时表
- 执行增、删、改之前,先将满足条件的数据查询出来放入到临时表中
- 将数据操作先在临时表中完成,完成过程中如果没用出现任何问题,就将数据同步(剪切)到实际的数据表中,并返回影响行数 ;完成过程中一旦出现错误,那就将临时表中满足条件的数据清掉,并返回错误码。
插入
- 先把要插入的数据放入临时表
- 将临时表中数据插入实际表中去
- 如果没问题,就复制一份到实际表中,并将临时表中的数据清空
- 如果有问题,返回错误信息,临时表清空
删除
- 先根据条件从原始表中查询来满足条件的数据行
- 将这些数据行复制一份到临时表
- 执行删除,如果出现错误原来的数据不动,临时表数据清空该条件的数据
- 如果执行成功,删除原始数据,返回影响行数
MVCC多版本并发控制
多版本并发控制(Multiversion Concurrency Control)
并发访问(读或写)数据库时,对正在事务内处理的数据做多版本的管理。以达到用来避免写操作的堵塞,从而引发读操 作的并发问题。
默认两个隐藏行:数据行版本号+删除行版本号
MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是,把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能.
MVCC不是MySQL独有的技术,Oracle、PostgreSQL及其他一些数据库系统也使用同样的技术。
原理
MVCC是通过及时保存在某些时刻的数据快照而得以实现的。
这意味着同一事务的多个实例,在同时运行时,无论每个实例运行多久,它们看到的数据视图是一致的。而同一时间,对于同一张表,不同事务看到的数据却是不同的。
下面分别以select、delete、 insert、 update语句来说明:
select
对于select语句,只有同时满足了下面两个条件的行,才能被返回:
- 行的被修改版本号小于或者等于该事务号
- 行的被删除版本号要么没有被定义,要么大于事务的版本号:
- 行的删除版本号如果没有被定义,说明该行没有被删除过;
- 如果删除版本号大于当前事务的事务号,说明该行是被该事务后面启动的事务删除的,由于是repeatable read隔离等级,后开始的事务对数据的影响不应该被先开始的事务看见,所以该行应该被返回.
insert
对新插入的行,行的更新版本被修改为该事务的事务号
delete
对于删除,innodb直接把该行的被删除版本号设置为当前的事务号,相当于标记为删除,而不是实际删除
update
在更新行的时候,innodb会把原来的行复制一份到回滚段中,并把当前的事务号作为该行的更新版本
优缺点
优点
保存这些额外记录的好处是使大多数读操作都不必申请加锁,这使都操作变得尽可能的块,因为读操作只要选取符合标准的行数据即可。
缺点
存储引擎必须为每行数据存储更多的额外数据,做更多的行检查工作,以及处理一些额外的整理操作。
MVCC对应隔离级别
- MVCC只工作在REPEATABLE READ和READ COMMITTED两个隔离级别。
- READ UNCOMMITTED隔离级别不兼容MVCC,因为在任何情况下,该隔离级别下的查询,不读取符合当前事务版本的数据行,而读取最新版本的数据行,
- SERIALIZABLE隔离级别也不兼容MVCC,因为该级下的读操作会对每一个返回行都进行加锁。
评论区