欢迎来到【趣味网源码】【activiti设计器源码】【别墅图纸超市源码】innodb源码开发-皮皮网网站!!!

皮皮网

【趣味网源码】【activiti设计器源码】【别墅图纸超市源码】innodb源码开发-皮皮网 扫描左侧二维码访问本站手机端

【趣味网源码】【activiti设计器源码】【别墅图纸超市源码】innodb源码开发

2024-11-25 03:35:31 来源:{typename type="name"/} 分类:{typename type="name"/}

1.MySQL 核心模块揭秘 | 12 期 | 创建 savepoint
2.innodb和myisam的区别
3.MySql轻松入门系列——第二站 使用visual studio 对mysql进行源码级调试
4.MySQL 核心模块揭秘 | 13 期 | 回滚到 savepoint
5.源码详解系列(四) ------ DBCP2的源码使用和分析(包括JNDI和JTA支持)已停更

innodb源码开发

MySQL 核心模块揭秘 | 12 期 | 创建 savepoint

       回滚操作,除了回滚整个事务,源码还可以部分回滚。源码部分回滚,源码需要保存点(savepoint)的源码协助。本文我们先看看保存点里面都有什么。源码趣味网源码

       作者:操盛春,源码爱可生技术专家,源码公众号『一树一溪』作者,源码专注于研究 MySQL 和 OceanBase 源码。源码 爱可生开源社区出品,源码原创内容未经授权不得随意使用,源码转载请联系小编并注明来源

       本文基于 MySQL 8.0. 源码,源码存储引擎为 InnoDB。源码

       InnoDB 的源码事务对象有一个名为undo_no 的属性。事务每次改变(插入、更新、删除)某个表的一条记录,都会产生一条 undo 日志。这条 undo 日志中会存储它自己的序号。这个序号就来源于事务对象的 undo_no 属性。

       也就是说,事务对象的 undo_no 属性中保存着事务改变(插入、更新、删除)某个表中下一条记录产生的 undo 日志的序号。

       每个事务都维护着各自独立的 undo 日志序号,和其它事务无关。

       每个事务的 undo 日志序号都从 0 开始。事务产生的第 1 条 undo 日志的序号为 0,第 2 条 undo 日志的activiti设计器源码序号为 1,依此类推。

       InnoDB 的 savepoint 结构中会保存创建 savepoint 时事务对象的 undo_no 属性值。

       我们通过 SQL 语句创建一个 savepoint 时,server 层、binlog、InnoDB 会各自创建用于保存 savepoint 信息的结构。

       server 层的 savepoint 结构是一个SAVEPOINT 类型的对象,主要属性如下:

       binlog 的 savepoint 结构很简单,是一个 8 字节的整数。这个整数的值,是创建 savepoint 时事务已经产生的 binlog 日志的字节数,也是接下来新产生的 binlog 日志写入 trx_cache 的 offset。

       为了方便介绍,我们把这个整数值称为binlog offset。

       InnoDB 的 savepoint 结构是一个trx_named_savept_t 类型的对象,主要属性如下:

       创建 savepoint 时,server 层会分配一块 字节的内存,除了存放它自己的 SAVEPOINT 对象,还会存放 binlog offset 和 InnoDB 的 trx_named_savept_t 对象。

       server 层的 SAVEPOINT 对象占用这块内存的前 字节,InnoDB 的 trx_named_savept_t 对象占用中间的 字节,binlog offset 占用最后的 8 字节。

       客户端连接到 MySQL 之后,MySQL 会分配一个专门用于该连接的用户线程。

       用户线程中有一个m_savepoints 链表,用户创建的多个 savepoint 通过 prev 属性形成链表,m_savepoints 就指向最新创建的 savepoint。

       server 层创建 savepoint 之前,会按照创建时间从新到老,别墅图纸超市源码逐个查看链表中是否存在和本次创建的 savepoint 同名的 savepoint。

       如果在用户线程的 m_savepoints 链表中找到了和本次创建的 savepoint 同名的 savepoint,需要先删除 m_savepoints 链表中的同名 savepoint。

       找到的同名 savepoint,是 server 层的SAVEPOINT 对象,它后面的内存区域分别保存着 InnoDB 的 trx_named_savept_t 对象、binlog offset。

       binlog 是个老实孩子,乖乖的把 binlog offset 写入了 server 层为它分配的内存里。删除同名 savepoint 时,不需要单独处理 binlog offset。

       InnoDB 就不老实了,虽然 server 层也为 InnoDB 的 trx_named_savept_t 对象分配了内存,但是 InnoDB 并没有往里面写入内容。

       事务执行过程中,用户每次创建一个 savepoint,InnoDB 都会创建一个对应的 trx_named_savept_t 对象,并加入 InnoDB 事务对象的 trx_savepoints 链表的末尾。

       因为 InnoDB 自己维护了一个存放 savepoint 结构的链表,server 层删除同名 savepoint 时,InnoDB 需要找到这个链表中对应的 savepoint 结构并删除,流程如下:

       InnoDB 从事务对象的 trx_savepoints 链表中删除 trx_named_savept_t 对象之后,server 层接着从用户线程的 m_savepoints 链表中删除 server 层的SAVEPOINT 对象,也就连带着清理了 binlog offset。

       处理完查找、删除同名 savepoint 之后,server 层就正式开始创建 savepoint 了,这个过程分为 3 步。

       第 1 步,日历表源码binlog 会生成一个 Query_log_event。

       以创建名为test_savept 的 savepoint 为例,这个 event 的内容如下:

       binlog event 写入 trx_cache 之后,binlog offset 会写入 server 层为它分配的 8 字节的内存中。

       第 2 步,InnoDB 创建 trx_named_savept_t 对象,并放入事务对象的 trx_savepoints 链表的末尾。

       trx_named_savept_t 对象的 name 属性值是 InnoDB 的 savepoint 名字。这个名字是根据 server 层为 InnoDB 的 trx_named_savept_t 对象分配的内存的地址计算得到的。

       trx_named_savept_t 对象的savept 属性,是一个 trx_savept_t 类型的对象。这个对象里保存着创建 savepoint 时,事务对象中 undo_no 属性的值,也就是下一条 undo 日志的序号。

       第 3 步,把 server 层的 SAVEPOINT 对象加入用户线程的 m_savepoints 链表的尾部。

       server 层会创建一个SAVEPOINT 对象,用于存放 savepoint 信息。

       binlog 会把binlog offset 写入 server 层为它分配的一块 8 字节的内存里。

       InnoDB 会维护自己的 savepoint 链表,里面保存着trx_named_savept_t 对象。

       如果 m_savepoints 链表中存在和本次创建的 savepoint 同名的 savepoint, 创建新的 savepoint 之前,server 层会从链表中删除这个同名的 savepoint。

       server 层创建的 SAVEPOINT 对象会放入m_savepoints 链表的末尾。

       InnoDB 创建的 trx_named_savept_t 对象会放入事务对象的trx_savepoints 链表的末尾。

innodb和myisam的区别

       InnoDBMyISAM使用MySQL用两表类型各优缺点视具体应用定基本差别:MyISAM类型支持事务处理等高级处理InnoDB类型支持MyISAM类型表强调性能其执行数度比InnoDB类型更快提供事务支持InnoDB提供事务支持已经外部键等高级数据库功能  MyIASMIASM表新版本扩展:  二进制层移植性  NULL列索引  变行比ISAM表更少碎片  支持文件  更索引压缩  更键统计布  更更快auto_increment处理  些细节具体实现差别:  1.InnoDB支持FULLTEXT类型索引  2.InnoDB保存表具体行数说执行select count(*) from tableInnoDB要扫描遍整表计算少行MyISAM要简单读保存行数即注意count(*)语句包含where条件两种表操作  3.于AUTO_INCREMENT类型字段InnoDB必须包含该字段索引MyISAM表其字段起建立联合索引  4.DELETE FROM tableInnoDB重新建立表行行删除  5.LOAD TABLE FROM MASTER操作InnoDB起作用解决首先InnoDB表改MyISAM表导入数据再改InnoDB表于使用额外InnoDB特性(例外键)表适用  另外InnoDB表行锁绝执行SQL语句MySQL能确定要扫描范围InnoDB表同锁全表例update table set num=1 where name like %aaa%  任何种表都万能用恰针业务类型选择合适表类型才能发挥MySQL性能优势.    MySQLMyISAM引擎与InnoDB引擎性能简单测试  [硬件配置]  CPU : AMD+ (1.8G)  内存: 1G/现代  硬盘: G/IDE  [软件配置]  OS : Windows XP SP2  SE : PHP5.2.1  DB : MySQL5.0.  Web: IIS6  [MySQL表结构]  CREATE TABLE `myisam` (  `id` int() NOT NULL auto_increment,  `name` varchar() default NULL,  `content` text,  PRIMARY KEY (`id`)  ) ENGINE=MyISAM DEFAULT CHARSET=gbk;  CREATE TABLE `innodb` (  `id` int() NOT NULL auto_increment,  `name` varchar() default NULL,  `content` text,  PRIMARY KEY (`id`)  ) ENGINE=InnoDB DEFAULT CHARSET=gbk;  [数据内容]  $name = "heiyeluren";  $content = "MySQL支持数存储引擎作同表类型处理器MySQL存储引擎包括处理事务安全表引擎处理非事务安全表引擎:· MyISAM管理非事务表提供高速存储检索及全文搜索能力MyISAM所MySQL配置支持默认存储引擎除非配置MySQL默认使用另外引擎 ·MEMORY存储引擎提供内存表MERGE存储引擎允许集合处理同MyISAM表作单独表像MyISAMMEMORYMERGE存储引擎处理非事务表两引擎都默认包含MySQL 释:MEMORY存储引擎式确定HEAP引擎· InnoDBBDB存储引擎提供事务安全表BDB包含支持操作系统发布MySQL-Max二进制发版InnoDB默认包括所MySQL 5.1二进制发版按照喜通配置MySQL允许或禁止任引擎·EXAMPLE存储引擎存根引擎做用引擎创建表没数据存储于其或其检索引擎目服务MySQL源代码例演示说明何始编写新存储引擎同主要兴趣发者";  [插入数据-1] (innodb_flush_log_at_trx_commit=1)  MyISAM 1W:3/s  InnoDB 1W:/s  MyISAM W:/s  InnoDB W:/s  MyISAM W:/s  InnoDB W:没敢测试  [插入数据-2] (innodb_flush_log_at_trx_commit=0)  MyISAM 1W:3/s  InnoDB 1W:3/s  MyISAM W:/s  InnoDB W:/s  MyISAM W:/s  InnoDB W:/s  [插入数据3] (innodb_buffer_pool_size=M)  InnoDB 1W:3/s  InnoDB W:/s  InnoDB W:/s  [插入数据4] (innodb_buffer_pool_size=M, innodb_flush_log_at_trx_commit=1, set autocommit=0)  InnoDB 1W:3/s  InnoDB W:/s  InnoDB W:/s  [MySQL 配置文件] (缺省配置)  # MySQL Server Instance Configuration File  [client]  port=  [mysql]  default-character-set=gbk  [mysqld]  port=  basedir="C:/mysql/"  datadir="C:/mysql/Data/"  default-character-set=gbk  default-storage-engine=INNODB  sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"  max_connections=  query_cache_size=0  table_cache=  tmp_table_size=M  thread_cache_size=8  myisam_max_sort_file_size=G  myisam_max_extra_sort_file_size=G  myisam_sort_buffer_size=M  key_buffer_size=M  read_buffer_size=K  read_rnd_buffer_size=K  sort_buffer_size=K  innodb_additional_mem_pool_size=4M  innodb_flush_log_at_trx_commit=1  innodb_log_buffer_size=2M  innodb_buffer_pool_size=M  innodb_log_file_size=M  innodb_thread_concurrency=8  【总结】  看MySQL 5.0面MyISAMInnoDB存储引擎性能差别并针InnoDB说影响性能主要 innodb_flush_log_at_trx_commit 选项设置1每插入数据候都自提交导致性能急剧降应该跟刷新志关系设置0效率能够看明显提升同SQL提交SET AUTOCOMMIT = 0设置达性能另外听说通设置innodb_buffer_pool_size能够提升InnoDB性能我测试发现没特别明显提升  基本我考虑使用InnoDB替代我MyISAM引擎InnoDB自身良特点比事务支持、存储程、视图、行级锁定等等并发情况相信InnoDB表现肯定要比MyISAM强相应my.cnf配置比较关键良配置能够效加速应用  复杂Web应用非关键应用继续考虑MyISAM具体情况自斟酌Mysql InnoDBMyISAM区别

MySql轻松入门系列——第二站 使用visual studio 对mysql进行源码级调试

       在探索MySQL世界的过程中,有些同学希望更深入地了解如何在Visual Studio中进行源码级调试。不用担心,哪里有源码下载让我们一步步来。

       必备工具

       MySQL是用C++编写的,要在Windows上编译,需要几个关键工具:CMake用于生成可打开的解决方案,如MySQL.sln;Boost是强大的C++库,Bison是用于解析MySQL语法规则的工具;当然,选择适合自己版本的MySQL源码(如5.7.)也是必不可少的。

       详细安装步骤

       安装过程需要细心,特别是Bison,务必避免默认路径中的空格问题,以免后续VS编译受阻。安装CMake和Bison时选择自定义路径,例如C:\2\GnuWin,确保它们的bin文件路径被添加到环境变量中。接下来解压mysql-5.7..zip,构建项目。

       编译与调试

       使用CMake编译MySQL源码,当看到Build files written to: C:/2/mysql-5.7./brelease,说明成功生成.sln文件。用Visual Studio 打开MySql.Sln,耐心等待十几分钟,编译成功后即可进行下一步。

       启动MySQL并调试

       首先,开启MySQL的调试模式,修改mysqld.cc中的test_lc_time_sz方法。然后,在Visual Studio的命令行参数中加入--console --initialize,开始调试。可能会遇到编码问题,解决后,输入默认密码zJDE>IC5o+ya,连接到MySQL并修改密码。

       追踪write_row

       在上一篇中提到的write_row是一个虚方法,通过实际调试,我们可以看到它在ha_innodb.cc的实现。设置断点,执行insert操作,可以看到代码进入ha_innodb::write_row方法,深入查看局部变量和调用堆栈,验证之前的理论。

       总结

       通过一整天的努力,我们掌握了在Visual Studio中对MySQL源码进行调试的技巧。记住,每一步都可能是个挑战,但只有亲自动手,才能真正理解MySQL的运作机制。希望这些经验能帮助你避免一些常见的坑,祝你在源码的世界里探索得更深入!

MySQL 核心模块揭秘 | 期 | 回滚到 savepoint

       深入理解 MySQL,了解如何实现部分回滚操作。本文由技术专家操盛春撰写,他在公众号『一树一溪』分享 MySQL 和 OceanBase 源码研究。本文基于 MySQL 8.0.,InnoDB 存储引擎,探讨核心模块的工作原理。

       首先,我们创建测试表并插入数据。关键操作分为四个阶段,编号为 SQL 1 至 SQL 4,其中 SQL 4 是讨论焦点。SQL 2 和 SQL 3 分别产生 undo 日志 0 和 1。

       当执行事务时,产生的 binlog 日志在 trx cache 中。回滚整个事务时,需要清除这些日志。然而,实际操作中,binlog 回滚步骤看似简单,却并未执行真正清除,只是为后续的 InnoDB 回滚做准备。

       InnoDB 回滚是关键环节,它会根据 undo 日志执行反向操作,恢复事务影响的数据。以 SQL 为例,会从最新的 undo 日志开始回滚,逐条执行反向操作,包括记录的删除。

       回滚后,事务的执行状态需要通过提交事务来更新。这不同于 commit 语句,因为回滚操作已经改变了数据,即使从逻辑上看恢复了原样,也需要将 InnoDB 中的修改正式提交。

       trx cache 中的 binlog 日志会在 InnoDB 回滚完成后进行清除,这个过程涉及内存 buffer 和磁盘临时文件。binlog 回滚步骤延迟到这个阶段,是因为在事务提交前,binlog 日志并不需要写入持久化存储。

       总结起来,MySQL 的部分回滚包括:无实际动作的 binlog 回滚,执行 InnoDB 回滚恢复数据,然后提交 InnoDB 事务,最后清理 trx cache 中的临时 binlog。如果你对文中内容有疑问,欢迎留言交流。

       对于 SQL 质量管理,如需更多工具支持,可以了解 SQLE,一个覆盖开发到生产环境的 SQL 管理平台,提供流程自动化和数据质量管理功能。

源码详解系列(四) ------ DBCP2的使用和分析(包括JNDI和JTA支持)已停更

       深入剖析DBCP2的精髓,掌握连接池管理与事务支持(DBCP2),它在项目开发中的作用不容小觑。让我们一起探索它的配置、源码细节以及JNDI和JTA的支持。

       1. 环境配置

       以JDK 1.8、Maven 3.6.1、Eclipse 4.和MySQL 5.7.为平台,DBCP 2.6.0提供高效连接管理。以下是关键步骤:

       创建dbcp.properties,配置基础数据库连接信息,如driverClassName、url、字符编码和时区。

       通过BasicDataSourceFactory获取BasicDataSource实例,这是连接池的核心。

       执行SQL操作时,通过dataSource.getConnection()获取Connection对象。

       项目结构上,包括Maven项目、war打包、JUnit测试框架和必要的库依赖。

       2. 配置详解

       基础配置包括连接池大小(maxTotal、maxIdle、minIdle)和初始化数量(initialSize)。务必关注验证SQL(validationQuery)、超时时间(maxWaitMillis)和资源回收策略。

       例如,连接池配置示例:

       url=jdbc:mysql://localhost:/github_demo?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=true

       连接池参数如PSCache、lifo、connectionInitSqls等,务必启用testWhileIdle检测连接状态。

       3. JNDI与JTA支持

       DBCP支持JNDI获取数据源,如PerUserPoolDataSource和SharedPoolDataSource,分别针对不同的用户连接管理策略。在Tomcat 9.0.中,可通过Spring-like配置实现,如在web.xml中定义DataSource引用。

       对于JTA事务,DBCP提供BasicManagedDataSource和ManagedDataSource类,用于支持XA事务,例如在MySQL中启用innodb_support_xa。

       4. 实践与测试

       使用Atomikos的transactions-jdbc,为JTA事务提供支持,例如设置DefaultCatalog以避免资源冲突。在测试时,确保两阶段提交的正确性,如START、END、PREPARE、COMMIT和ROLLBACK。

       5. 源码洞察

       源码中,从BasicDataSource.getConnection()开始,初始化连接池,包括创建Connection对象、DataSource实例和设置相关参数。核心组件如GenericObjectPool的makeObject()方法展示了连接对象的创建逻辑。

       理解了这些,你将能更有效地利用DBCP2来优化数据库资源管理,确保应用程序的稳定性和性能。

       欲了解更多源码链接和详细教程,请参考:[源码链接] 和 [原创文章链接]

       本文由[作者]撰写,版权所有,转载请注明出处。