mysql数据库 mvcc

这篇具有很好参考价值的文章主要介绍了mysql数据库 mvcc。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 在看MVCC之前我们先补充些基础内容,首先来看下事务的ACID和数据的总体运行流程

  数据库整体的使用流程:

mysql数据库 mvcc,数据库,数据库,mysql,面试

ACID流程图 

mysql数据库 mvcc,数据库,数据库,mysql,面试

mysql核心日志:

在MySQL数据库中有三个非常重要的日志binlog,undolog,redolog.

mysql数据库 mvcc,数据库,数据库,mysql,面试

mvcc概念介绍:

MVCC(Multi-Version Concurrency Control):多版本并发控制,是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。 MVCC 在 MySQL InnoDB 中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。

当前读和快照读的概念:

当前读(Current Read)指的是读取数据当前最新数据。这种读取方式需要保证其他并发事务不能修改当前记录,因此会对读取的记录进行加锁。在执行当前读操作时,用户可以访问数据库中最新的数据状态,包括最近提交的事务所做的修改。这种读取方式具有实时数据可见性,因为它读取的是已提交的最新数据。加锁的SELECT操作,或者对数据进行增删改都会进行当前读。

快照读(Snapshot Read)则是指在读取数据时,生成读取快照,并在同一个事务中可能会一直读取此快照的数据。快照读读到的数据可能不是最新的,而是历史版本的数据。这些历史版本的数据可以从undo log中获取。在事务中的SELECT不加锁的情况下,会执行快照读。快照读依赖readview来实现。需要注意的是,快照读的前提是隔离级别不是串行级别,因为在串行级别下的快照读会退化成当前读。

总的来说,当前读和快照读的主要区别在于它们读取数据的方式和时间点。当前读总是读取最新的已提交数据,而快照读则可能读取历史版本的数据。这两种读取方式在数据库操作中各有其应用场景和优势。

mysql数据库 mvcc,数据库,数据库,mysql,面试

他们相互之间的联系:

  1. MVCC与快照读
    • 快照读是MVCC的一个实现方式。当执行快照读时,数据库会提供一个数据的一致性快照,而不是当前最新的数据。这个快照是基于某个时间点的数据版本,可能不是最新的。
    • 由于快照读是基于多版本的,因此它不需要对读取的数据加锁,从而实现了非阻塞的读取操作。
    • 在MySQL的InnoDB存储引擎中,快照读是通过read view机制来实现的。read view记录了某个时间点的系统活跃事务列表,并根据这个列表来判断哪些数据版本对当前事务是可见的。
  2. MVCC与当前读
    • 当前读是读取数据的最新版本,并且在读取时会加锁,以确保其他并发事务不能修改当前记录。
    • 在MVCC的上下文中,当前读会读取最新的数据版本,这个版本是与当前事务ID相关联的。
    • 当前读通常发生在执行SELECT ... FOR UPDATEUPDATEDELETE等操作时,这些操作需要确保读取的数据在事务处理期间不会被其他事务修改。

代码实例:
1.创建表

CREATE TABLE example (  
    id INT PRIMARY KEY,  
    value INT  
);  
  
INSERT INTO example (id, value) VALUES (1, 100);  
INSERT INTO example (id, value) VALUES (2, 200);

事务A(当前读):

START TRANSACTION;  
SELECT * FROM example WHERE id = 1 FOR UPDATE; -- 当前读,会加锁

 事务B(快照读):

START TRANSACTION;  
SELECT * FROM example WHERE id = 1; -- 快照读,不会加锁,读取的是事务开始时的数据版本

 事务A修改数据:

UPDATE example SET value = 150 WHERE id = 1; -- 事务A修改数据

事务B修改数据:

START TRANSACTION;  
SELECT * FROM example WHERE id = 1 FOR UPDATE; -- 事务B的当前读

 

好了 本篇文章就到这里 在这里我向大家推荐一个性价比很高课程:

https://xxetb.xetslk.com/s/2PjJ3T文章来源地址https://www.toymoban.com/news/detail-829713.html

到了这里,关于mysql数据库 mvcc的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 面试八股文Mysql:(2)数据库调优

    数据库优化在提升系统性能是很重要的一个方面,不管是MySQL还是MongoDB还是其它的数据库。 SQL优化在提升系统性能中是成本最低 优化效果最明显的途径,可以让 吞吐量更大,响应速度更快 。如果你的团队在SQL优化这方面搞得很优秀,对你们整个大型系统可用性方面无疑是一

    2024年02月13日
    浏览(34)
  • 深入解析MVCC:多版本并发控制的数据库之道

    目录 引言 一、什么是MVCC? 二、MVCC的实现原理 2.1版本号 2.1.1版本号的作用: 2.1.2版本号的组成: 2.1.3.示例 2.2事务id 2.2.1事务ID的作用: 2.2.2事务ID的生成: 2.2.3示例: 2.3 快照(Snapshot) 2.3.1快照的作用: 2.3.2快照的实现方式: 2.3.3示例: 2.4版本链(Version Chain) 2.4.1版本链

    2024年01月24日
    浏览(47)
  • java八股文面试[数据库]——MySQL索引的数据结构

    知识点: 【2023年面试】mysql索引的基本原理_哔哩哔哩_bilibili 【2023年面试】mysql索引结构有哪些,各自的优劣是什么_哔哩哔哩_bilibili

    2024年02月10日
    浏览(32)
  • mysql数据库面试题基础知识,Hadoop之MapReduce04,腾讯java面试流程

    该方法的执行过程比较复杂,我们慢慢来分析,首先来看下简化的时序图 3.1waitForCompletion public boolean waitForCompletion(boolean verbose ) throws IOException, InterruptedException, ClassNotFoundException { // 判断任务的状态,如果是DEFINE就提交 if (state == JobState.DEFINE) { submit(); } if (verbose) { // 监听并且

    2024年04月14日
    浏览(46)
  • java八股文面试[数据库]——MySQL死锁的原因和处理方法

    1) 表的死锁 产生原因 : 用户A访问表A(锁住了表A),然后 又访问表B ;另一个用户B访问表B(锁住了表B),然后企图 访问表A ;这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B才能继续,同样用户B要等用户A释放表A才能继续,这就死锁就产生了。 用户A--》A表(表

    2024年02月09日
    浏览(38)
  • mysql面试题30:什么是数据库连接池、应用程序和数据库建立连接的过程、为什么需要数据库连接池、你知道哪些数据库连接池

    该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 数据库连接池是一种用于管理和复用数据库连接的技术。它是在应用程序和数据库之间建立一组数据库连接,并以池的形式存储起来,每当应用程序需

    2024年02月07日
    浏览(44)
  • 从小白到数据库达人!Mysql优化让你的社招面试无往不利!

    大家好,我是小米,在这个美好的时刻又迎来了我们的技术小窝。今天,我们要聊一聊一个在数据库领域中无比重要的话题 —— Mysql 优化 !是不是感觉很兴奋呢?废话不多说,让我们直接进入今天的主题。 首先,我们要了解一下 Mysql 到底是什么。 Mysql 是一个开源的关系型

    2024年02月14日
    浏览(25)
  • 面试之MySQL中的mvcc

     首先需要知道什么是 MVCC? MVCC 多版本并发控制。MVCC就是通过数据行的多个版本管理来实现数据库的并发控制。这项技术是的InnoDB的事务隔离级别下执行一致性读 有了保证。换言之,就是为了查询一些正在被一个事务更新的行。并且可以看到他们被更新之前的值。查询在做查

    2024年02月16日
    浏览(24)
  • java八股文面试[数据库]——数据库三范式

    什么是范式? 范式是数据库设计时遵循的 一种规范 ,不同的规范要求遵循不同的范式。 最常用的三大范式 第一范式(1NF): 属性不可分割 ,即每个属性都是不可分割的原子项。(实体的属性即表中的列) 理解:一个列不能包含两个数据 第二范式(2NF):满足第一范式;且不存在

    2024年02月10日
    浏览(27)
  • 数据库面试题题

    -- 子查询 CREATE TABLE emp(     empno        INT,     ename        VARCHAR(50),     job        VARCHAR(50),     mgr        INT,     hiredate    DATE,     sal        DECIMAL(7,2),     comm        DECIMAL(7,2),     deptno        INT ) ; INSERT INTO emp VALUES(7369,\\\'SMITH\\\',\\\'CLERK\\\',7902,\\\'198

    2024年02月15日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包