MVCC多版本并发控制的理解「建议收藏」

MVCC多版本并发控制的理解「建议收藏」##前置知识 ###当前读与快照读 当前读 什么是当前读:读取的是最新的数据,不会读到老数据。 何时触发:update、insert、delete、select lock in share mode、

MVCC多版本并发控制的理解

前置知识

当前读与快照读

当前读
什么是当前读:读取的是最新的数据,不会读到老数据。
何时触发:update、insert、delete、select lock in share mode、select for update时,总是当前读。
快照读
什么是快照读:读取的是历史版本,不是最新的数据。
何时触发:select
MVCC多版本并发控制的理解「建议收藏」
这些关系一定要搞清楚!

事务的ACID

原子性:事务要么全部成功,要么全部失败。实现:undolog回滚日志实现。相当于存储在磁盘中的历史记录链、还有一个更官方的名字:快照
一致性:由另外三个共同达到一致性。
隔离性:事务并发执行时内部操作不能互相干扰。实现:锁实现。
持久性:事务一旦提交,对数据库的影响应该是永久的。实现:redolog实现。

Innodb引擎的日志

1、undolog
作用:保存历史快照。
目的:实现原子性,在MVCC中也起到了一定的作用。
2、redolog
作用:预写日志。
目的:为了高效实现持久性,将数据持久化。
详解:首先,在执行数据更新时,效率是低的,目前几乎所有软件硬件的瓶颈,都卡在了IO层面。IO有两种:顺序读写随机读写。那明明是解释redolog的,怎么就说起了IO呢?这要先明确一点,就是顺序读写与随机读写的效率是谁快谁慢的问题。顺序读写:顾名思义,就是顺序向尾部一次添加数据,属于append的操作,不需要查找。随机读写:需要指针的移动查找。所以很明显,顺序读写的效率是要远高于随机读写的。举个例子,比如在一家饭店,中午有人来吃饭,这家店允许赊账,所以很多人会选择赊账,而店主呢,就把所有的赊账信息记录在一本厚厚的本子里,假设里面记了一万条赊账信息。好了,中午最繁忙的时候,所有员工都在忙着工作,如果有人要赊账,怎么办?根本没机会一个一个仔细找记录。所以很自然的就会想到,我在墙上装个黑板,或者单独在一张纸上列出来今天的赊账名单。等不忙了,我再慢慢地把名单记录到本子里。所以,现在已经很明显了,redolog就是顺序读写,它快速记录数据,然后数据再由顺序读写区域慢慢向随机读写区域转换。这就是WAL:预写日志
redolog是Innodb引擎的日志,而MySQLserver中自带的日志中有binlog,所以它俩是共存的,所以在运行时,必须保证一致性,因为binlog是MySQL主从复制时向从机同步信息的,如果不写binlog,那么从机会出问题,但是应该先写哪一个呢?先写哪个都会出问题!一旦写第一个时断电,就会造成主机与从机不一致。解决的方法是给redolog加个状态,当redolog写完数据后,给它状态为prepare,然后去写binlog,当binlog写完后,再把redolog的状态从prepare改为commit。这就是两阶段提交

MVCC

宏观来看,MVCC就是解决事务的隔离性的问题的。

MySQL的并发场景

MySQL的并发场景有三种:读读读写写写
读读:不存在数据安全问题。
读写:存在数据安全问题。如脏读、不可重复读、幻读。
写写:存在数据安全问题。如丢失更新。
而MVCC则是以不加锁的方式解决读写冲突问题。

MVCC的组成部分

表的隐藏字段:数据库表在定义时除了自己声明的字段,还会包括一些隐藏字段,包括有:
DB_TRX_ID :最近修改事务ID。指创建这条记录或最后一次修改这条记录的事务id。
DB_ROLL_PTR :回滚指针。指向记录的上一个版本,即指向undolog首条记录。
DB_ROW_ID :隐藏主键。如果表没有主键,自动生成一个6字节的row id。
MVCC多版本并发控制的理解「建议收藏」

readview

快照读时会产生readview,即select时会产生readview。
MVCC多版本并发控制的理解「建议收藏」
举个demo:
MVCC多版本并发控制的理解「建议收藏」
当select时,产生了快照读,此时生成的readview可以看到。
而如何看能否读取到值呢?MySQL有可见性算法。
MVCC多版本并发控制的理解「建议收藏」
再举一个demo
MVCC多版本并发控制的理解「建议收藏」
对比一下,如果按照我们的判断,可以发现蓝色的readview与第一个demo中的readview一模一样。但是问题在于,蓝色的select是不能读取到修改之后的数据的。这当然是因为蓝色的readview是错误的,它真正的readview其实就是黄色的readview,也就是下图
MVCC多版本并发控制的理解「建议收藏」

结论

所以,隔离级别解决数据不可重复读的关键,在于MVCC生成readview的机制或者时机,如果是读已提交级别RC,每次快照读都会生成readview,所以会产生不可重复读的问题。如果是可重复读隔离级别RR,只会在第一次快照读时产生readview,不会有不可重复读的问题。
至此,MVCC结束
至于幻读问题,则需要加锁来解决,幻读产生的根本原因在于:当前读和快照读一起使用!如果一个事务中只有快照读,那么永远不会出现幻读问题。

原文地址:https://www.cnblogs.com/coderhzy/archive/2022/08/03/16540440.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/4928.html

(0)
上一篇 2023-05-30
下一篇 2023-05-30

相关推荐

  • redis 入门一「终于解决」

    redis 入门一「终于解决」一、redis 简介 1、什么是 redis? redis 是一个开源免费的高性能的 key – value 数据库。 支持数据持久化,即可以将内存的数据存储在磁盘中,重启服务后可以再次加载磁盘中的数

    2023-02-15
    155
  • 开源hadoop系统搭建_hadoop技术

    开源hadoop系统搭建_hadoop技术一、直播介绍 上期雅泽同学对ChengYing是什么、有什么样的功能特性,如何快速入门做了介绍,本期海洋同学将会为大家分享ChengYing部署Hadoop集群实战的相关内容,欢迎大家积极参与。 二、

    2023-05-29
    138
  • 一文带你学习DWS数据库用户权限设计与管理[通俗易懂]

    一文带你学习DWS数据库用户权限设计与管理[通俗易懂]前言 本文将介绍DWS基于RBAC(Role-Based Access Control,基于角色的访问控制)的数据库用户权限管理。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造…

    2023-03-28
    148
  • Python Regex $字符的应用

    Python Regex $字符的应用
    在正则表达式中,$字符是匹配字符串的末尾位置。 在一行文本中,末尾位置是指行尾字符(如果有的话)的右侧位置。$字符可以用于在匹配文本时定位结尾,并且有几种方式可以使用它来实现定位。

    2024-03-16
    76
  • Python字符串添加字符串

    Python字符串添加字符串Python中,字符串是不可变的,也就是说,一旦一个字符串被创建,它不能被修改。那么如果我们需要在一个字符串的某个位置添加另一个字符串,应该怎么实现呢?本篇文章将详细讲解Python中字符串添加字符串的方法。

    2024-08-02
    35
  • Mysql 从入门到遗忘「建议收藏」

    Mysql 从入门到遗忘「建议收藏」Made By Herolh 目录 { index} [TOC] 一、MySQL是什么: 服务端 客户端 Mysql数据库 Mysql是最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最

    2022-12-16
    134
  • Python中ln和log10函数的运用

    Python中ln和log10函数的运用ln函数是以e为底数的对数函数,在Python中可以使用math库中的log函数来实现。log函数的语法格式为:

    2024-02-18
    88
  • 基于Storm的WordCount「建议收藏」

    基于Storm的WordCount「建议收藏」Storm WordCount 工作过程 Storm 版本: 1、Spout 从外部数据源中读取数据,随机发送一个元组对象出去; 2、SplitBolt 接收 Spout 中输出的元组对象,将元组中的

    2022-12-27
    149

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注