首页 > 数据库 >mysql的MVCC多版本并发机制

mysql的MVCC多版本并发机制

时间:2023-06-21 15:16:27浏览次数:60  
标签:事务 快照 读取 幻读 MVCC 并发 mysql

1. mysql的MVCC多版本并发机制

目录

1.1. 定义

  • MVCC
    MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。
    在MySQL中,MVCC并不是Server级别的实现,而是InnoDB引擎的实现。

  • 快照读
    像不加锁的select操作就是快照读,即不加锁的非阻塞读;快照读的前提是隔离级别不是串行级别,串行级别下的快照读会退化成当前读;之所以出现快照读的情况,是基于提高并发性能的考虑,快照读的实现是基于多版本并发控制,即MVCC,可以认为MVCC是行锁的一个变种,但它在很多情况下,避免了加锁操作,降低了开销;由于是基于多版本,即快照读可能读到的并不一定是数据的最新版本,而有可能是之前的历史版本。

  • 当前读
    像select lock in share mode(共享锁), select for update ; update, insert ,delete(排他锁)这些操作都是一种当前读,为什么叫当前读?就是它读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。

  • 幻读
    事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据,这种情况称为幻读。
    注意:幻读特指新插入的数据。如果事务A 按一定条件搜索, 期间事务B 删除了符合条件的某一条数据,导致事务A再次读取时数据少了一条。这种情况归为不可重复读。

1.2. 什么情况下会出现幻读?

  • 全部使用快照读
    这种情况是最简单的。由于MVCC机制的存在,每个事务开始的时候读取的都是固定的版本的数据。很明显这种情况是不会出现幻读的。

  • 全部使用当前读
    由于MySQL间隙锁读存在,后执行的事务会被之前运行的事务阻塞。即退化到串形执行。这种情况也不会存在幻读情况

  • 当前读快照读混用
    可以发现这种混用的情况是会出现幻读的。

1.3. 结论

可重复读隔离级别下,一个事务中只使用当前读,或者只使用快照读都能避免幻读。如果当前读和快照读混用的话就不能保证不出现幻读。

1.4. 事务的ACID

原子性:整个事务中的所有操作要么全部提交成功,要么全部失败回滚;
一致性:总是从一个一致性的状态转换到另外一个一致性的状态,无中间状态;
隔离性:一个事务所做的修改在最终提交以前,对其他事务是不可见的;
持久性:一旦事务提交,其所做的修改就会永久保存到数据库中,即使系统崩溃,数据也不会丢失。

事务的隔离级别

未提交读:事务中的修改,即是没有提交,对其他事务也都是可见的,会出现脏读;
提交读:一个事务开始时,只能看见已经提交的事务所做的修改,也叫不可重复读;
可重复读:保证了再同一个事务中多次读取同样记录的结果是一致的,会出现幻读;
可串行化:会在读取的每一行数据上都加锁,可能导致大量的超时和锁竞争问题。

mvcc

1.5. 锁

写锁比读锁有更高的优先级,因此一个写锁请求可能会被插入到读锁队列的前面。

共享锁(读锁):多个客户在同一时刻可以同时读取同一个资源,二互不干扰;
排他锁(写锁):一个写锁会阻塞其他的写锁和读锁。

1.6. 锁粒度

尽量只锁定需要修改的部分数据,而不是所有资源,锁定的数据量越少,则系统的并发程度越高。
表锁:它会锁定整张表,一个用户对表进行写操作(插入、删除、更新等)前,需要先获得写锁,这会阻塞其他用户对该表的所有读写操作。只有没有写锁时,其他读取的用户才能获得读锁,读锁之前是不相互阻塞的;
行级锁:最大程度支持并发处理,只在存储引擎层面实现,而MySQL服务器层没有实现。

1.7. 多版本并发控制(MVCC)

不管需要执行多长时间,每个事务看到的数据都是一致的。根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。

InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现。这两个列,一个保存了行的创建时间,一个保存行的删除时间,并不是实际的世界,而是系统版本号。每开始一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号作比较,MVCC只在可重读读和提交读两种隔离级别下工作。

可重复读下的MVCC的操作方法

标签:事务,快照,读取,幻读,MVCC,并发,mysql
From: https://www.cnblogs.com/xulinforDB/p/17496238.html

相关文章

  • MySQL查询缓存的优缺点
    1.MySQL查询缓存的优缺点目录1.MySQL查询缓存的优缺点1.1.前言1.2.工作原理1.3.查询缓存对什么样的查询语句,无法缓存其记录集,大致有以下几类:1.4.查询缓存的优缺点:1.5.查询缓存的配置1.6.维护1.6.1.查询缓存区的碎片整理1.6.2.清空查询缓存的数据1.7.性能监控1.8.适合......
  • mysql基础的sql语法
    1.mysql基础语法目录1.mysql基础语法1.1.MYSQL的窗口函数1.1.1.什么是窗口函数1.1.2.窗口函数的用法1.1.2.1.专用窗口函数按班级分类,将成绩降序排序1.1.2.2.其他专用窗口函数:dense_rank/row_number1.1.3.经典面试问题-topN问题1.1.3.1.相关业务问题:1.1.3.2.解决方法查......
  • mysql超时参数详解
    1.mysql超时参数详解目录1.mysql超时参数详解1.1.分类1.1.1.连接、网络类超时1.1.2.connect_timeout:默认为10S1.1.3.wait_timeout:默认是8小时,即28800秒1.1.4.interactive_timeout:默认是8小时,即28800秒1.2.net_read_timeout:默认是30S1.2.1.net_write_timeout:默认是60S1.2......
  • mysql索引及索引创建原则
    1.mysql索引及索引创建原则目录1.mysql索引及索引创建原则1.1.使用场景1.1.1.什么时候用索引1.1.2.索引的弱点1.1.3.MySQL会使用到索引的场景如下:1.2.查看表上的索引1.3.索引类型1.3.1.组合索引1.3.1.1.组合索引生效规则1.3.2.前缀索引1.3.3.函数索引1.3.4.唯一索......
  • mysql索引和基本概念
    1.mysql索引和基本概念目录1.mysql索引和基本概念1.1.声明1.2.什么是索引1.3.二分查找法(BinarySearch)1.4.二叉查找树(BST)1.4.1.二叉树的特点1.4.2.二叉树存在的问题1.5.平衡二叉树(AVLTree)1.5.1.平衡二叉树的特点1.6.索引需要存储什么1.7.B树的特点1.7.1.B树是......
  • mysql 密码插件 validate_password
    MySQL密码增强插件2016-07-0110:02pursuer.chen阅读(668)评论(0)编辑[收藏](javascript:void(0))介绍以前没有太注意MySQL密码安全策略的配置方法,只是人为了将密码设为复杂密码,但是没有找到配置的方法,今天姜承尧的微信公众号正好发布了一篇关于这个的文章,所以在这里也顺......
  • MySQL笔记整理
    SELECT0+'123.00';SELECT0+'123.0qwe';SELECT0+'qwe1';SELECT0+null;SELECT'123.00'/4;SELECT'123.0qwe'/4;SELECT'qwe1'/4;SELECT'1qwe'/4;SELECTnull/4;SELECTconvert(......
  • MySQL自带的性能压力测试工具mysqlslap
    1.MySQL自带的性能压力测试工具mysqlslap目录1.MySQL自带的性能压力测试工具mysqlslap1.1.概述1.2.常用参数[options]详解1.3.测试范例:1.3.1.实例11.3.2.实例21.3.3.实例3(自定义sql语句)1.3.4.实例4(指定sql脚本)1.3.5.实际测试中的复杂情况。(指定表字段)1.4.测试结......
  • mysql proxy实现读写分离
    Mysql-proxy实现读写分离目录Mysql-proxy实现读写分离环境说明Mysql-proxy简介部署mysql-proxy服务读写分离测试总结环境说明Mysql-proxy简介mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等MySQLProxy就是这么一个中间层代理,简单的说,MySQLPro......
  • MySQL性能压测工具SysBench详解(非常详细)
    MySQL性能压测工具SysBench详解(非常详细)概述掌握数据库的性能情况是非常必要的。本文介绍了MySQL基准测试的基本概念,以及使用sysbench对MySQL进行基准测试的详细方法;基准测试与压力测试简介1、什么是基准测试数据库的基准测试是对数据库的性能指标进行定量的、可复现的、可......