mysql mvcc理解
2013-09-21 23:21
176 查看
写时复制和多版本并发控制,都能够实现读事务不加锁。下面介绍mvcc,以mysql innodb存储引擎为例子。
innodb每一行维护了两个隐含的列,一个存储了行被修改的时间,一个是行被删除的时间。这个时间 不是绝对时间,而是与数据库系统对应的版本号,每当一个事物开始时,innodb会给这个事物一个递增的版本号,所以版本号也可以认为是事物号。对于每一行查询语句,innodb都会把这个查询语句的版本号同这个查询语句遇到的行的版本号进行对比,然后结合不同的事物隔离级别,来决定是否返回改行。
1.select
对于select语句,只有同时满足了下面两个条件的行,才会被返回。
a)行的修改版本号小于等于该事物号。
b)行的删除版本号要么没有定义,要么大于事物的版本号。
如果行的修改或者删除版本号大于事物号,说明行是被该事物后面启动的事物修改或者删除的。在可重复读取隔离的级别下,后开始事物对数据的影响不应该被先前的事物看见,所以应该忽略后开始的事物的更新或则删除操作。
insert
新插入的行,行的修改版本号更新为该事物版本号
delete
innodb把改行的删除的版本号设置为该事物的版本号,标记为删除,而不是物理删除。
update
在更新行的时候,innodb会把原来的行复制一份,该行的修改版本号即为事物版本号
mvcc读书数据不用加锁,查询通过版本检查,获取需要的版本,大大提高了系统的并发度。当然,为了实现多版本,必须对每行存储多个版本的数据。
mvcc会定期检查版本,删除不需要的版本数据。
innodb每一行维护了两个隐含的列,一个存储了行被修改的时间,一个是行被删除的时间。这个时间 不是绝对时间,而是与数据库系统对应的版本号,每当一个事物开始时,innodb会给这个事物一个递增的版本号,所以版本号也可以认为是事物号。对于每一行查询语句,innodb都会把这个查询语句的版本号同这个查询语句遇到的行的版本号进行对比,然后结合不同的事物隔离级别,来决定是否返回改行。
1.select
对于select语句,只有同时满足了下面两个条件的行,才会被返回。
a)行的修改版本号小于等于该事物号。
b)行的删除版本号要么没有定义,要么大于事物的版本号。
如果行的修改或者删除版本号大于事物号,说明行是被该事物后面启动的事物修改或者删除的。在可重复读取隔离的级别下,后开始事物对数据的影响不应该被先前的事物看见,所以应该忽略后开始的事物的更新或则删除操作。
insert
新插入的行,行的修改版本号更新为该事物版本号
delete
innodb把改行的删除的版本号设置为该事物的版本号,标记为删除,而不是物理删除。
update
在更新行的时候,innodb会把原来的行复制一份,该行的修改版本号即为事物版本号
mvcc读书数据不用加锁,查询通过版本检查,获取需要的版本,大大提高了系统的并发度。当然,为了实现多版本,必须对每行存储多个版本的数据。
mvcc会定期检查版本,删除不需要的版本数据。
相关文章推荐
- 深入理解abstract class和interface
- 函数重载与C++对#include的理解
- Blueprint规范理解(续二)
- spring的一点小小理解
- 对被请求-节点多播地址(solicited-node multicast address) 的理解
- 分区、内存-深入理解Oracle表(5):三大表连接方式详解之Hash Join的定义,原-by小雨
- 用IP地址的用途理解Loopback接口
- HTTP TCP/UDP Socket 简单理解
- loader中contentLoaderInfo的理解
- 理解MySQL——并行数据库与分区(Partition)
- 理解C++默默编写并调用哪些函数
- Java中hashcode的理解
- 基础的知识点,跳转页面,以及layer的理解
- CSS3中:nth-child和:nth-of-type的区别深入理解
- Audio框架层理解
- CNN笔记:通俗理解卷积神经网络
- 支持向量机的近邻理解:图像二分类为例(3)
- [转]理解水平扩展和垂直扩展
- java中原码、反码和补码--时钟理解法
- 理解OAuth 2.0