Innodb MVCC源码实现

本文深入解析了多版本并发控制(MVCC)的工作原理,重点介绍了Oracle和MySQL如何利用undo机制实现MVCC,以及不同事务隔离级别下MVCC的具体运作方式。

1. 概述

MVCC:

即多版本一致性,在事务模型下,使用version控制数据版本,关系型数据库基本都实现了MVCC,以对表数据的读写互不阻塞,增大了并发量。

Oracle和MySQL数据库都是使用undo的机制来实现MVCC。
但数据库都实现了多个事务的隔离级别,所以MVCC中对可见性的判断,也会因事务的隔离级别不同而不相同。

2. 相关数据结构

struct trx_struct{
read_view_t*    global_read_view;
read_view_t*    read_view;
......
}

事务结构体:每一个sql根据read_view或者global_read_view来实现一致性读取。

struct read_view_struct{
trx_id_t    low_limit_no;
trx_id_t    low_limit_id;
trx_id_t    up_limit_id;
ulint    n_trx_ids;
trx_id_t*    trx_ids;
......
}

read_view结构体:包括当前的活动事务的范围,以及活动事务数组,对于每一行记录,根据记录中的trx_id以及当前查询的read_view
进行判断记录的可见性。

3. 记录和undo

记录的格式:

  每一条记录都包括:主键,trx_id, undo_point, columns
  undo_point指向了行记录的前映像,一致性版本就是通过undo来构造。

比如测试用例:
session1:
  create table test(id int primary key, name varchar(100));
  insert into test values(1, 'xxxx');
  commit;
session2:
  update test set name='yyyy' where id=1;

其形成的记录的格式如下图所示:

  

这里只体现了undo的一个链表,我们称为undo的深度链表,用于实现mvcc。

还存在一个undo的链表,是一个广度链表,记录了这个事务的所有undo,用于rollback,回滚事务。下一篇blog介绍undo相关的内容。

 

3. 可见性判断

函数:read_view_sees_trx_id。


read_view中保存了当前全局的事务的范围:
【low_limit_id, up_limit_id】

1. 当行记录的事务ID小于当前系统的最小活动id,就是可见的。
  if (trx_id < view->up_limit_id) {
    return(TRUE);
  }
2. 当行记录的事务ID大于当前系统的最大活动id,就是不可见的。
  if (trx_id >= view->low_limit_id) {
    return(FALSE);
  }
3. 当行记录的事务ID在活动范围之中时,判断是否在活动链表中,如果在就不可见,如果不在就是可见的。
  for (i = 0; i < n_ids; i++) {
    trx_id_t view_trx_id
      = read_view_get_nth_trx_id(view, n_ids - i - 1);

    if (trx_id <= view_trx_id) {
    return(trx_id != view_trx_id);
    }
  }

4. 事务隔离级别的影响

但是:对于两张不同的事务隔离级别
  tx_isolation='READ-COMMITTED': 语句级别的一致性:只要当前语句执行前已经提交的数据都是可见的。
  tx_isolation='REPEATABLE-READ'; 语句级别的一致性:只要是当前事务执行前已经提交的数据都是可见的。

针对这两张事务的隔离级别,使用相同的可见性判断逻辑是如何做到不同的可见性的呢?

 

这里就要看看read_view的生成机制:

1. read-commited:
  函数:ha_innobase::external_lock

  if (trx->isolation_level <= TRX_ISO_READ_COMMITTED
    && trx->global_read_view) {
    /* At low transaction isolation levels we let
    each consistent read set its own snapshot */

  read_view_close_for_mysql(trx);

 

即:在每次语句执行的过程中,都关闭read_view, 重新在row_search_for_mysql函数中创建当前的read_view。
这样就可以根据当前的全局事务链表创建read_view的事务区间,实现read committed隔离级别。

2. repeatable read:
  在repeatable read的隔离级别下,创建事务trx结构的时候,就生成了当前的global read view。
  使用trx_assign_read_view函数创建,一直维持到事务结束,这样就实现了repeatable read隔离级别。

转载于:https://www.cnblogs.com/xpchild/p/3925382.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值