MySQL 5.7: Innodb事务对象缓存

在5.7中,Innodb引入了一个pool结构来专门做对象缓存重用。这可能会提升短连接场景的性能。本文的目的主要是理清其代码结构。当然主要是作为一个C++小白,学习下C++的一些代码STYLE。

代码版本:MySQL 5.7.5

我们这里以事务对象池为例

1.初始化的过程如下:

trx_pools = UT_NEW_NOKEY(trx_pools_t(MAX_TRX_BLOCK_SIZE));

trx_pools 全局变量,也是操作trx pool的接口,类型为trx_pools_t

其定义如下:

typedef Pool<trx_t, TrxFactory, TrxPoolLock> trx_pool_t;

对应:

template <typename Type, typename Factory, typename LockStrategy>

其中,trx_t表示事务对象类型,TrxFactory封装了事务的初始化和,TrxPoolLock封装了POOL锁的创建,销毁,加锁,解锁。

typedef PoolManager<trx_pool_t, TrxPoolManagerLock >;

PoolManager封装了池的管理方法

显然,这里涉及到多个类:

Pool 及 PoolManager 是共用的类

TrxFactory 和 TrxPoolLock, TrxPoolManagerLock是trx pool私有的类。

–TrxFactory用于定义池中事务对象的初始化和销毁动作;

–TrxPoolLock用于定义每个池中对象的互斥锁操作

–由于POOL的管理结构支持多个POOL对象, TrxPoolManagerLock用于互斥操作增POOL对象。支持多个POOL对象的目的是分拆单个POOL对象的锁开销,因为从POOL中获取和返还对象,都是需要排他锁的。

相关类的关系如下图所示:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#获取一个事务对象:trx_pools->get();

#释放一个事务对象:trx_pools->free(trx);通过trx指针计算出element的起始地址,然后将element放回Pool

 

2.除了事务对象外,为每个事务对象也缓存了一部分记录锁对象,表锁对象

new(&trx->lock.rec_pool) lock_pool_t();

new(&trx->lock.table_pool) lock_pool_t();

每个事务对象缓存8个记录锁对象(REC_LOCK_CACHE)和 8个表级锁对象(TABLE_LOCK_CACHE),不过这些结构相对上面的就简单多了,只是简单的vector

时间: 2024-07-31 14:34:10

MySQL 5.7: Innodb事务对象缓存的相关文章

MySQL · 引擎特性 · InnoDB 事务子系统介绍

前言 在前面几期关于 InnoDB Redo 和 Undo 实现的铺垫后,本节我们从上层的角度来阐述 InnoDB 的事务子系统是如何实现的,涉及的内容包括:InnoDB的事务相关模块.如何实现MVCC及ACID.如何进行事务的并发控制.事务系统如何进行管理等相关知识.本文的目的是让读者对事务系统有一个较全面的理解. 由于不同版本对事务系统都有改变,本文的所有分析基于当前GA的最新版本MySQL5.7.9,但也会在阐述的过程中,顺带描述之前版本的一些内容.本文也会介绍5.7版本对事务系统的一些优

MySQL · 引擎特性 · InnoDB 事务系统

前言 关系型数据库的事务机制因其有原子性,一致性等优秀特性深受开发者喜爱,类似的思想已经被应用到很多其他系统上,例如文件系统等.本文主要介绍InnoDB事务子系统,主要包括,事务的启动,事务的提交,事务的回滚,多版本控制,垃圾清理,回滚段以及相应的参数和监控方法.代码主要基于RDS 5.6,部分特性已经开源到AliSQL.事务系统是InnoDB最核心的中控系统,涉及的代码比较多,主要集中在trx目录,read目录以及row目录中的一部分,包括头文件和IC文件,一共有两万两千多行代码. 基础知识

MySQL · 引擎特性 · InnoDB 事务锁简介

InnoDB 事务锁系统简介 前言 本文的目的是对InnoDB的事务锁模块做个简单的介绍,使读者对这块有初步的认识.本文先介绍行级锁和表级锁的相关概念,再介绍其内部的一些实现:最后以两个有趣的案例结束本文. 本文所有的代码和示例都是基于当前最新的MySQL5.7.10版本. 行级锁 InnoDB支持到行级别粒度的并发控制,本小节我们分析下几种常见的行级锁类型,以及在哪些情况下会使用到这些类型的锁. LOCK_REC_NOT_GAP 锁带上这个FLAG时,表示这个锁对象只是单纯的锁在记录上,不会锁

MySQL · 引擎特性 · InnoDB 事务锁系统简介

前言 本文的目的是对 InnoDB 的事务锁模块做个简单的介绍,使读者对这块有初步的认识.本文先介绍行级锁和表级锁的相关概念,再介绍其内部的一些实现:最后以两个有趣的案例结束本文. 本文所有的代码和示例都是基于当前最新的 MySQL5.7.10 版本. 行级锁 InnoDB 支持到行级别粒度的并发控制,本小节我们分析下几种常见的行级锁类型,以及在哪些情况下会使用到这些类型的锁. LOCK_REC_NOT_GAP 锁带上这个 FLAG 时,表示这个锁对象只是单纯的锁在记录上,不会锁记录之前的 GA

MySQL内核月报 2014.12-MySQL· 性能优化·5.7 Innodb事务系统

背景知识 为了便于理解下文,我们先简单梳理下Innodb中的事务.视图.多版本的相关背景知识. 在Innodb中,每次开启一个事务时,都会为该session分配一个事务对象.而为了对全局所有的事务进行控制和协调,有一个全局对象trx_sys,对trx_sys相关成员的操作需要trx_sys->mutex锁. Innodb使用一种称做ReadView(视图)的对象来判断事务的可见性(也就是ACID中的隔离性).根据可见性原则,某个新开启的事务不应该看到其他未提交的事务. Innodb在执行一个SE

MySQL · 引擎特性 · InnoDB文件系统管理

综述 从上层的角度来看,InnoDB层的文件,除了redo日志外,基本上具有相当统一的结构,都是固定block大小,普遍使用的btree结构来管理数据.只是针对不同的block的应用场景会分配不同的页类型.通常默认情况下,每个block的大小为UNIV_PAGE_SIZE,在不做任何配置时值为16kb,你还可以选择在安装实例时指定一个块的block大小. 对于压缩表,可以在建表时指定block size,但在内存中表现的解压页依旧为统一的页大小. 从物理文件的分类来看,有日志文件,主系统表空间文

MySQL · 引擎特性 · InnoDB Fulltext简介

前言 从MySQL5.6版本开始支持InnoDB引擎的全文索引,语法层面上大多数兼容之前MyISAM的全文索引模式. 所谓全文索引,是一种通过建立倒排索引,快速匹配文档的方式.MySQL支持三种模式的全文检索模式: 第一种是自然语言模式(IN NATURAL LANGUAGE MODE),即通过MATCH AGAINST 传递某个特定的字符串来进行检索. 第二种是布尔模式(IN BOOLEAN MODE),可以为检索的字符串增加操作符,例如"+"表示必须包含,"-"

MySQL · 引擎特性 · InnoDB 崩溃恢复过程

在前面两篇文章中,我们详细介绍了 InnoDB redo log 和 undo log 的相关知识,本文将介绍 InnoDB 在崩溃恢复时的主要流程. 本文代码分析基于 MySQL 5.7.7-RC 版本,函数入口为 innobase_start_or_create_for_mysql,这是一个非常冗长的函数,本文只涉及和崩溃恢复相关的代码. 在阅读本文前,强烈建议翻阅下面两篇文章: 1. MySQL · 引擎特性 · InnoDB undo log 漫游 2. MySQL · 引擎特性 · I

MySQL · 引擎特性 · InnoDB undo log 漫游

本文是对整个Undo生命周期过程的阐述,代码分析基于当前最新的MySQL5.7版本.本文也可以作为了解整个Undo模块的代码导读.由于涉及到的模块众多,因此部分细节并未深入. 前言 Undo log是InnoDB MVCC事务特性的重要组成部分.当我们对记录做了变更操作时就会产生undo记录,Undo记录默认被记录到系统表空间(ibdata)中,但从5.6开始,也可以使用独立的Undo 表空间. Undo记录中存储的是老版本数据,当一个旧的事务需要读取数据时,为了能读取到老版本的数据,需要顺着u