InnoDB MVCC实现原理及源码解析

147人阅读 评论(1) 收藏 举报
分类:

1、原理介绍

数据多版本(MVCC)是MySQL实现高性能的一个主要的一个主要方式,通过对普通的SELECT不加锁,直接利用MVCC读取指版本的值,避免了对数据重复加锁的过程。InnoDB支持MVCC多版本,其中RC和RR隔离级别是利用consistent read view方式支持的,即在某个时刻对事物系统打快照记下所有活跃读写事务ID,之后读操作根据事务ID与快照中的事务ID进行比较,判断可见性。

2、InnoDB数据行结构

行结构中,除了用户定义的列外还有3个系统列:DATA_ROW_ID、DATA_TRX_ID、DATA_ROLL_PTR,如果表没有定义主键那么DATA_ROW_ID作为主键列,否则行结构中没有DATA_ROW_ID列。其中:

    DATA_TRX_ID:修改该行数据的事务的ID

    DATA_ROLL_PTR:指向该行回滚段的指针。

整个MVCC实现,关键靠这2个字段来完成。

3、READ-VIEW原理流程

4、READ-VIEW解读

1)read view是和SQL语句绑定的,在每个SQL语句执行前申请或获取(RR隔离级别:事务第一个select申请,之后都用这个;RC隔离级别:每个select都会申请)

2)read view结构

struct read_view_t{
	ulint		type;	/*!< VIEW_NORMAL, VIEW_HIGH_GRANULARITY */
	undo_no_t	undo_no;/*!< 0 or if type is
				VIEW_HIGH_GRANULARITY
				transaction undo_no when this high-granularity
				consistent read view was created */
	trx_id_t	low_limit_no;
				/*!< The view does not need to see the undo
				logs for transactions whose transaction number
				is strictly smaller (<) than this value: they
				can be removed in purge if not needed by other
				views */
	trx_id_t	low_limit_id;
				/*!< The read should not see any transaction
				with trx id >= this value. In other words,
				this is the "high water mark". */
	trx_id_t	up_limit_id;
				/*!< The read should see all trx ids which
				are strictly smaller (<) than this value.
				In other words,
				this is the "low water mark". */
	ulint		n_trx_ids;
				/*!< Number of cells in the trx_ids array */
	trx_id_t*	trx_ids;/*!< Additional trx ids which the read should
				not see: typically, these are the read-write
				active transactions at the time when the read
				is serialized, except the reading transaction
				itself; the trx ids in this array are in a
				descending order. These trx_ids should be
				between the "low" and "high" water marks,
				that is, up_limit_id and low_limit_id. */
	trx_id_t	creator_trx_id;
				/*!< trx id of creating transaction, or
				0 used in purge */
	UT_LIST_NODE_T(read_view_t) view_list;
				/*!< List of read views in trx_sys */
};

主要包括3个成员{low_limit_id,up_limit_id,trx_ids}。

    low_limit_id:表示创建read view时,当前事务活跃读写链表最大的事务ID,即最近创建的除自身外最大的事务ID

    up_limit_id:表示创建read view时,当前事务活跃读写链表最小的事务ID。

    trx_ids:创建read view时,活跃事务链表里所有事务ID

3)对于小于等于RC的隔离级别,每次SQL语句结束后都会调用read_view_close_for_mysql将read view从事务中删除,这样在下一个SQL语句启动时,会判断trx->read_view为NULL,从而重新申请。对于RR隔离级别,则SQL语句结束后不会删除read_view,从而下一个SQL语句时,使用上次申请的,这样保证事务中的read view都一样,从而实现可重复读的隔离级别。

4)对于可见性判断,分配聚集索引和二级索引。聚集索引:

     记录的DATA_TRX_ID < view->up_limit_id:在创建read view时,修改该记录的事务已提交,该记录可见

   DATA_TRX_ID >= view->low_limit_id:当前事务启动后被修改,该记录不可见

   DATA_TRX_ID 位于(view->up_limit_id,view->low_limit_id):需要在活跃读写事务数组查找trx_id是否存在,如果存在,记录对于当前read view是不可见的。

   二级索引:

    由于InnoDB的二级索引只保存page最后更新的trx_id,当利用二级索引进行查询的时候,如果page的trx_id小于view->up_limit_id,可以直接判断page的所有记录对于当前view是可见的,否则需要回clustered索引进行判断。

5)如果记录对于view不可见,需要通过记录的DB_ROLL_PTR指针遍历history list构造当前view可见版本数据

6)start transaction和begin语句执行后并没有在innodb层分配事务ID、回滚段、read_view、将事务放到读写事务链表等,这个操作需要第一个SQL语句调用函数trx_start_low来完成,这个需要注意。




查看评论

mysql 源码学习笔记:mysqld启动流程

mysql 5.7.16 源码学习笔记:mysqld启动流程 主要介绍mysqld启动过程中,对各个模块的启动顺序,为后续深入学习打下基础。...
  • slwang001
  • slwang001
  • 2016-12-20 20:52:13
  • 1085

mysql 源码阅读入口

mysql源码太多,初次看到不免让人没有头绪,如果根据特定需求,分模块的去阅读分析,查找特定功能如何实现之类的需求,可以从有限的几个入口看起,有两个主要入口:服务器启动,客户端请求处理。市面上的书大部...
  • aeolus_pu
  • aeolus_pu
  • 2017-02-04 09:10:28
  • 924

MySQL系列:innodb源码分析之page结构解析

在表空间结构分析当中,我们知道innodb的最小物理存储分配单位是page页,在MySQL-3.23版本的源码中,页只有两种页,一种是index page,一种是undo page。其类型值定义在fi...
  • u012935160
  • u012935160
  • 2014-12-28 20:15:08
  • 5996

Httpclient核心架构设计

背景知识Http简介通常,我们使用IE或者safari来访问互联网上的内容,只需要输入资源地址,浏览器便会呈现给你想要的内容。这一切的背后,都是迄今为止在计算机领域最成功的协议–http协议。Http...
  • szwandcj
  • szwandcj
  • 2016-05-05 21:28:11
  • 7481

HttpClient性能对比

httpclient性能对比
  • fytain
  • fytain
  • 2015-06-07 19:39:44
  • 4228

性能测试java协议使用httpclient方法引发的思考

最近手上在进行一个性能测试项目,脚本是java vuser 协议使用httpclient模拟http请求。并发用户数只有40个,但是服务器端启动的线程出现了400多个.我把线程的堆栈信息打印出来查看,...
  • weiweicao0429
  • weiweicao0429
  • 2016-08-02 18:38:08
  • 5535

转 MySQL源码分析

看到一个不错的介绍,原址如下: http://software.intel.com/zh-cn/blogs/2010/08/20/mysql0/   MySQL源码分析(0):编译安装及调试 ...
  • edwzhang
  • edwzhang
  • 2012-07-25 11:19:04
  • 22377

MySQL源码分析——代码结构与基本流程

MySQL基本架构 MySQL目录结构 •build: 内含有各个平台、各种编译器下进行编译的脚本。如compile-pentium-debug表示在pentium...
  • ajian005
  • ajian005
  • 2013-01-08 19:45:49
  • 5079

MySQL连接查询流程源码分析

初始化main |-mysqld |-my_init // 初始话线程变量,互斥量 |-load_defaults // 获取配置 |-in...
  • zjufirefly
  • zjufirefly
  • 2015-04-30 18:58:05
  • 5253

MySQL查询优化器源码分析--整体流程

函数间关系的主要逻辑如下: handle_select(){――第(1)层   mysql_union(); //处理union操作   mysql_select(){――第(2)层 JOIN...
  • fly2nn
  • fly2nn
  • 2017-03-13 18:54:19
  • 273
    公告
    欢迎交流 QQ:744516037 邮箱:yanzongshuai87@126.com 声明:版权所有,欢迎转载! 转载请注明出处:/yanzongshuai
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 14万+
    积分: 3653
    排名: 1万+
    钱柜娱乐开户
    最新评论