本文从5.1.48下的一个bug说起。前提是新特性fast index creation.
1、现象
5.1.48 (InnoDB plugin 1.0.9)
|
Session1
|
Session2
|
create table tb(a int)engine=innodb;
insert into tb values(1),(2),(3),(4),(5);
|
|
Begin;
|
|
select * from tb where a=3;
a
3
|
|
|
alter table tb add index a(a);
|
select * from tb where a=3;
ERROR 2013 (HY000): Lost connection to MySQL server during query
|
|
说明:session1提示lost connection,实际上MySQL已经dump了。
2、分析
这个结果还是比较好理解的。有fast index creation,默认不需要重作表,因此没有表锁。
Session1开始于加索引之前,第一个select语句使用的是全表扫描,第二个select语句执行时,索引已经建好,所以查询时候使用索引a。这在实现上就可能触发诸多雷区(实际上概念上都已经错误,下文描述)。
在这个版本的实现中,由于新建索引导致第二次select时候使用了prebuilt-> search_tuple. 这个结构在事务开始前没有初始化,因此在尝试使用时类型判断错误直接abort。(row0sel.c)
3、最新版本的实现
由于5.1.48在我们线上用的比较普遍,因此特别查了这个版本的实现和原因。在5.1最新版本中已经避免了这个问题;5.5最新版本也避免了,但有趣的是,两个版本的实现机制完全不同。
我们先列出两个版本的效果再讨论。
5.1.61的效果
5.1.61 (InnoDB plugin 1.0.17)
|
Session1
|
Session2
|
create table tb(a int)engine=innodb;
insert into tb values(1),(2),(3),(4),(5);
|
|
Begin;
|
|
select * from tb where a=3;
a
3
|
|
|
alter table tb add index a(a);
|
select * from tb where a=3;
ERROR 1412 (HY000): Table definition has changed, please retry transaction
|
|
5.5.19的效果
5.5.19
|
Session1
|
Session2
|
create table tb(a int)engine=innodb;
insert into tb values(1),(2),(3),(4),(5);
|
|
Begin;
|
|
select * from tb where a=3;
|
|
|
alter table tb add index a(a);
lock here
|
select * from tb where a=3;
a
3
|
|
可以看到,两个版本的实现方法不同。5.1里面通过判断索引生成时间与事务开始时间的差别,提示用户需要重启事务。
5.5则是作了个锁升级,锁住加索引操作。并且这个操作不影响session1的一致性读。(当然很容易想到在session1执行一个更新操作是什么效果)。
策略上5.5的实现更符合repeatable-read的概念。
4、其他
说明下,5.1的其他版本未试验。
分享到:
相关推荐
通过实例来分析linux中如何定位coredump问题。非常实用
javacore.txt文件用jca打开,heapdump.phd文件用ha打开。 Heap dump 文件是一个二进制文件,它保存了某一时刻在 Java 堆中所有对象的状态。这个文件最重要的作用就是分析 Java 堆内存泄露问题,heap analyzer,MAT ...
GDB之在线调试与Coredump分析,通过gdb一步步分析coredump文件。
AIX 下的 core dump 分析入门.mht,html文档,请大家参考以下
要保证存放coredump的目录存在且进程对该目录有写权限。存放coredump的目录即进程的当前目录,一般就是当初发出命令启动该进程时所在的目录。但如果是通过脚本启动,则脚本可能会修改当前目录,这时进程真正 的当前...
coredump栈分析介绍 coredump stack frame-pointer 栈分析 coredump stack frame-pointer 栈分析 coredump stack frame-pointer 栈分析,初学者可参考
coredump栈分析
高通core dump解析工具。仅自己上传做个备份。
Linux Core Dump 权威书籍
Android Coredump简介及使用_v1.0_201504281025.pdf
好用的线程dump分析工具
JavaCore和HeapDump分析工具
Linux下如何生成core dump
在window程序中,添加代码一边在程序崩溃时候产生coredump,能准确定位崩溃地点。
請下載本文用到的coredump: Linux Debugging: coredump 分析入門的材料Program received signal SIGSE
javacore文件及heapdump文件分析
IBM java dump 文件分析工具,分析java堆栈信息
如何在让docker中运行的进程生成core dump文件
用于分析dump文件,很好用的一款内存分析工具,可以用来分析OOM等问题
海思busybox+coredump