关于InnoDB业务的一个怪异”现象tengxun - 超凡娱乐

关于InnoDB业务的一个怪异”现象tengxun

2019-02-11 07:59:14 | 作者: 尔曼 | 标签: 业务,现象,成果 | 浏览: 4839

 

从session 1整个进程看来,它企图更新一个不存在的记载(a=2),成果更新成功,而且之后这个记载能够拜访。

 

2、剖析

       从其他正常的表象看来,在业务内,只要不触及更新,业务外的任何更新都是不行见的。上面实验中session 1内update之前履行的select *得到的成果仍是2条记载。

       尽管更新抵触时的战略见仁见智,但比方中的这个现象应该供给一种能够挑选的方法(至少应该答应装备)。

       接下来的篇幅首要剖析呈现这种现象的原因,以及通过简略修正完成如下的方法:关于查询不行见的记载,update操作不应该成功。

       因为更新抵触战略的复杂性,本文不处理更多的问题,简略比方:insert操作因为主键抵触的原因,刺进仍旧不答应。

 

3、源码相关

       先来阐明一下为什么过程4)中的查询成果仍为2条记载。

       Innodb内部每个业务开始时,都会有一个业务id, 一起业务目标中还有一个read_view变量,用于操控该业务可见的记载规模(MVCC)。关于每个拜访到的记载行,会依据read_view的trx_id(业务id)与行记载的trx_id比较,判别记载是否逻辑上可见。

       Session 2中刺进的记载不行见,原因即为session 1先于session 2,因而新刺进的数据通过判别,不在可见规模内。对应的源码在row/row0sel.c [4040-4055].

       {阐明: 源码版别5.1.45, 下同}

       发作的逻辑为

If(!lock_clust_rec_cons_read_sees(..)){

 

    //查看该记载是否本业务可见 

   row_sel_build_prev_vers_for_mysql(….); //不行见则找上一个版别      

   if (old_vers NULL) {goto next_rec;} //上一个版别没有这个记载,抛弃

}

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表超凡娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1
  • 2

    oracle权限传递tengxun

    权限,用户,时分
  • 3
  • 4
  • 5

    主题:ORACLE函数大全sohu

    字符串,字符,函数
  • 6

    数据库备份问题huabian

    数据库,备份,数据
  • 7

    MySQL刺进数据报错处理sina

    文件,目录,数据库
  • 8

    mysql计算句子ITeye头条

    数据,汇总,季度
  • 9

    zz 彻底卸载mysqlITeyeitjob

    目录,数据库,问题
  • 10