(3)并发读任务可以继续读取旧版本的数据,不至于阻塞;
MVCC 实现的原理大致:
InnoDB 每一行数据都有一个隐藏的回滚指针,用于指向该行修改前的最后一个历史版本,这个历史版本存放在 undo log 中 。如果要执行更新操作 , 会将原记录放入 undo log 中,并通过隐藏的回滚指针指向 undo log 中的原记录 。其它事务此时需要查询时,就是查询 undo log 中这行数据的最后一个历史版本 。MVCC 最大的好处是读不加锁 , 读写不冲突,极大地增加了 MySQL 的并发性 。通过 MVCC,保证了事务 ACID 中的 I(隔离性)特性 。
redo、undo为什么要有redo日志?
redo log 指事务中操作的任何数据 , 将最新的数据备份到一个地方
数据库事务提交后,必须将更新后的数据刷到磁盘上,以保证ACID特性 。磁盘随机写性能较低 , 如果每次都刷盘,会极大影响数据库的吞吐量 。优化方式是,将修改行为先写到redo日志里(此时变成了顺序写),再定期将数据刷到磁盘上,这样能极大提高性能
redo log 不是随着事务的提交才写入的,而是在事务的执行过程中,便开始写入 redo 中 。具体的落盘策略可以进行配置。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启 MySQL 服务的时候 , 根据 redo log 进行重做,从而达到事务的未入磁盘数据进行持久化这一特性 。
为什么要有undo日志?
undo log 指事务开始之前 , 在操作任何数据之前,首先将需操作的数据备份到一个地方 。
数据库事务未提交时,会将事务修改数据的镜像(即修改前的旧版本)存放到undo日志里 , 当事务回滚时,或者数据库奔溃时 , 可以利用undo日志,即旧版本数据,撤销未提交事务对数据库产生的影响 。
事务未提交之前 , Undo 保存了未提交之前的版本数据,Undo 中的数据可作为数据旧版本快照供其他并发事务进行快照读 。是为了实现事务的原子性而出现的产物,在 MySQL innodb 存储引擎中用来实现多版本并发控制 。
当前读和快照读当前读(Locking Read
)也称锁定读 , 读取当前数据的最新版本,而且读取到这个数据之后会对这个数据加锁,防止别的事务更改即通过next-key
锁(行锁+gap锁)来解决当前读的问题 。在进行写操作的时候就需要进行“当前读” , 读取数据记录的最新版本,包含以下SQL
类型:select ... lock in share mode
、select ... for update
、update
、delete
、insert
。
快照便是进行select
的那一刻,生成的当前数据库系统中所有未提交的事务id数组(数组里最小的id
为min_id
)和已经创建的最大事务id
(max_id
)的集合 , 即我们所说的一致性视图readview
。在进行快照读的过程中要根据一定的规则将版本链中每个版本的事务id
与readview
进行匹配查询我们需要的结果 。快照读是不会看到别的事务插入的数据的 。因此,幻读在“当前读”下才会出现 。快照读的实现是基于多版本并发控制,即MVCC
, 可以认为MVCC
是行锁的一个变种,但它在很多情况下,避免了加锁操作,降低了开销;既然是基于多版本 , 即快照读可能读到的并不一定是数据的最新版本,而有可能是之前的历史版本 。
RC和RR隔离级别下的快照读和当前读:RC隔离级别下,快照读和当前读结果一样,都是读取已提交的最新;RR隔离级别下,当前读结果是其他事务已经提交的最新结果 , 快照读是读当前事务之前读到的结果 。RR下创建快照读的时机决定了读到的版本 。
总结:快照读本质上读取的是历史数据(原理是回滚段) , 属于无锁查询
- 在
Serializable
隔离级别下 - 普通select
也变成当前读,即加共享读 - 在 RC 隔离级别下 - 每次
select
都会建立新的快照 - 在 RR 隔离级别下
- 事务启动后,首次
select
会建立快照 - 如果事务启动选择了
with consistent snapshot
, 事务启动时就建立快照 - 基于旧数据的修改操作,会重新建立快照
- 事务启动后,首次
推荐阅读
- 引擎之旅 Chapter.4 日志系统
- 金文奎 金文奎
- 关于HM NISEDIT在新版系统下编译并运行提示权限不足问题的解决方案
- SR寄存器BP[x:0]位 痞子衡嵌入式:一个关于Segger J-Flash在Micron Flash固定区域下载校验失败的故事
- SQL的事务
- 面试突击87:说一下 Spring 事务传播机制?
- 一文搞定 Spring事务
- 魅族watch发布时间_魅族watch什么时候发布
- 关于男子登山遇地震:尿里加奶粉求生的信息
- r7 5800h和i7 11800h哪个好_r7 5800h和i7 11800h对比