辛星浅析InnoDB的MVCC实现

首先说的是MVCC是一种思想,每种数据库在具体的实现上都会有所不同。而InnoDB的MVCC,是通过在每行记录保存两个隐藏列来实现的。而这两个列,一个是保存创建的版本,一个是保存删除的版本。

每当我们开始一个新的事务时,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,我们可以用它来和查询到的每行记录版本号作比较。下面我们以可重复读这个隔离级别下的一个范例来进行说明。

对于select操作,其中InnoDB只会检查版本小于或者等于当前事务的数据行,这样可以确保事务读取的行,是在事务开始前就已经存在的,或者是事务自身插入或者修改的。而行的删除版本,要么未定义,要么大于当前事务的版本。这可以确保事务能够取到的行,在事务开始之前没有被删除。

对于insert操作,其中InnoDB为新插入的每一行保存当前系统版本号作为行版本号。

对于delete操作,其中InnoDB删除的每一行都保存当前系统版本号作为删除标识。

对于update操作,其中Innodb会插入一条新记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行行为删除标识。

因为有这样的两个系统版本号,使得大多数读操作都可以不用加锁,这样的设计使得数据操作很简单,而且性能也更好,并且也会保证我们只读取到符合标准的行。

这种设计方式的不足之处就是,每行记录需要额外的存储空间,而且需要更多的检查工作,以及一些额外的维护工作。

需要注意的是,MVCC只能在可重复读和提交读者两个隔离级别下工作,而其他两个隔离级别和MVCC是不兼容的,而未提交读总是读取最新的数据行,而可串行化则会对所有读取的行加锁。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-03 17:58:35

辛星浅析InnoDB的MVCC实现的相关文章

辛星浅析You don't have permission to access / on this server.的解决办法

通常我们会遇到"You don't have permission to access / on this server."的提示,从字面意思是说,我们没有访问本服务器的权限,那么它常见的问题又是什么呢? 第一个假如是虚拟主机,那么可能是虚拟主机配置的错误,我们在<VirtualHost>对里面配置的时候,在其子配置项中,我们在<Directory>中修改为如下即可: Order  allow,deny Allow  from all 第二个原因就是我们没有响应

辛星浅析tar命令的基本使用

我们通常使用tar命令来对文件或者目录进行打包或者压缩,可能朋友们刚接触的时候会有点晕,百度搜的时候就和查手册一样,不够通俗易懂,今天辛星就给朋友们用另一种方式去解决这个问题. 我们首先还是要对它的几个关键参数认识一下的: -c  表示创建一个打包文件,这里的c是create的首字母 -x   表示解包一个已经打包的文件 -t    表示查看一个tar包里面的文件 因此,c和x和t这三个参数只能存在一个,不能同时存在,因为我们不能在打包的同时又解包 然后就是两个常见的与压缩有关的参数: -z  

辛星浅析网站中的sitemap

所谓sitemap,通俗来说就是"网站地图",sitemap文件主要包含了网站中的有效连接,它会便于搜索引擎的抓取和收录,如果没有sitemap文件,蜘蛛就需要一个一个的通过我们网站中的超链接来进行抓取.有了sitemap之后,搜索引擎直接读取该文件就可以了,它可以让搜索引擎抓取我们的网页更加有效. 最通用的也是最简单的sitemap形式的文件,就是xml文件,我们在其中列出网站中的网址,以及关于每个网址的一些元数据.这些元数据通常是上次更新的时间.更新的频率.重要程度等等,它可以让搜

辛星浅析乐观锁和悲观锁

有个网友问我乐观锁和悲观锁的相关问题,于是就来阐述一下这个问题.首先说乐观锁,它是Pessimistic  Lock的简写,也就是所谓的悲观锁.它是每次取数据的时候都会认为别人会修改它的数据,因此它是在每次取数据之前都会进行加锁操作,这样别人拿数据的时候就必须等待直到它释放锁.其实我们的关系型数据库中就用到了很多这种锁机制,比如行锁.表锁.写锁等等,都是在操作之前首先加一个锁. 所谓乐观锁,就是Optimistic   Lock的缩写,也就是所谓的乐观锁.它每次取数据的时候都认为别人不会去改数据

辛星浅析Redis中与key有关的命令

在Redis中,我们还可以直接对key直接操作,下面是我们常用的主要命令: (1)keypattern   它表示获取所有匹配pattern的keys,这里需要注意的是,我们应该避免使用该命令,因为对于大型数据库而言,该命令非常耗时,对Redis服务器的性能打击也是比较大的.它支持glob-style的通配符格式,比如用*表示任意一个或者多个字符,用?表示任意字符,用[xyz]表示方括号中的任意一个字母. (2)del   key ....   它是从数据库中删除参数中指定的keys,如果指定的

辛星浅析kill、pkill的区别

首先说一下kill命令,它是通过pid来杀死进程,要得到某个进程的pid,我们可以使用ps命令,默认情况下,kill命令发送给进程的终止信号是15,但是有些进程不会理这个信号,这样的话,可以用9信号来强制杀死,信号9是不会被忽略的强制性执行信号. 而killall和pkill都是使用命令名来终止进程的有效手段,它们不同于kill通过pid来杀死进程的方式,它可以理解为成批成批的杀死进程,当然这么做的危险性也相对提高了不少.当然它们也可以给进程发送相应的终止信号. 比如我们要杀死apache的相关

辛星浅析git中的submodule

有时候,我们需要将一些通用的部分抽取出来做成一个公共库,它可以给别的工程使用,而公共代码库的版本管理是比较麻烦的.我们可以使用git中的submodule来做到这一点. 1.添加 为当前工程添加submodule,命令格式是:git   submodule   add   仓库地址    路径 在添加完成后,在当前工程路径下会生成一个名为".gitmodules"的文件,它记录了子模块的信息,添加完成之后,将子模块所在的文件夹添加到工程中即可. 2.删除 删除submodule,我们首

辛星浅析Redis中的配置文件

Redis中的主要配置项如下: (1)daemonize  yes     它表示是否在后台运行,如果写成yes,那么在后台运行,如果是no,则表示不在后台运行. (2)pidfile  /var/run/redis.pid 当Redis在后台运行的时候,Redis默认会把pid文件放在/var/run/redis.pid,我们也可以在运行多个Redis服务时,指定不同的pid文件和端口 (3)port    6379    指定Redis运行的端口,默认是6379 (4)127.0.0.1  

辛星浅析tty、pty与pts

首先我们还是从概念入手,所谓tty,它是TeletypeWriter的缩写,它的中文翻译就是电传打字机,它的主要功能就是打印信息和阅读信息,后来被键盘和显示器所取代.而tty现在通俗一点的理解就是终端. 终端又是什么呢?它就是一种电子的或者机电的硬件设备,它可以用来向大型主机输入数据并且显示来自主机的数据.在计算机的早期,很多计算机都会连接若干个终端控制台,这些终端的硬件结构都很简单,它们不执行计算的任务,它们只是负责输入用户的命令,并且把计算的结果反馈回来. 前面我们的电传打字机就可以理解为最