一个最不可思议的MySQL死锁分析

一 24th, 2014

 

1    死锁问题背景    1

1.1    一个不可思议的死锁    1

1.1.1    初步分析    3

1.2    如何阅读死锁日志    3

2    死锁原因深入剖析    4

2.1    Delete操作的加锁逻辑    4

2.2    死锁预防策略    5

2.3    剖析死锁的成因    6

3    总结    7

 

 

  1. 死锁问题背景

 

做MySQL代码的深入分析也有些年头了,再加上自己10年左右的数据库内核研发经验,自认为对于MySQL/InnoDB的加锁实现了如指掌,正因如此,前段时间,还专门写了一篇洋洋洒洒的文章,专门分析MySQL的加锁实现细节:《MySQL加锁处理分析》。

 

但是,昨天”润洁”同学在《MySQL加锁处理分析》这篇博文下咨询的一个MySQL的死锁场景,还是彻底把我给难住了。此死锁,完全违背了本人原有的锁知识体系,让我百思不得其解。本着机器不会骗人,既然报出死锁,那么就一定存在死锁的原则,我又重新深入分析了InnoDB对应的源码实现,进行多次实验,配合恰到好处的灵光一现,还真让我分析出了这个死锁产生的原因。这篇博文的余下部分的内容安排,首先是给出”润洁”同学描述的死锁场景,然后再给出我的剖析。对个人来说,这是一篇十分有必要的总结,对此博文的读者来说,希望以后碰到类似的死锁问题时,能够明确死锁的原因所在。

 

阅读全文…

2013年个人微博推荐技术资料汇总

十二 25th, 2013

2013年,过的很充实,生活上如此,技术上亦是。这一年,看了很多的技术资料,技术上也有了很大的提高。而且,本着分享的精神,很多好的技术资料,也都在个人微博@何_登成 上做了推荐。今天,下定决心将整个2013年在微博上推荐的技术资料整理了一下,说真的,写的不少,看的更多。

 

下面的这些资料,都是精品资料,个人已经看了其中的95%左右,余下未看的,需要找时间看完,已经看过的,也准备找时间多温习几遍,好东西,不怕多看。对于个人来说,这算是一个总结与收藏;对于阅读此博文的朋友来说,也可以各取所需,一起追求技术的进步。

 

注:资料的组织,先按照领域划分,包括:(Concurrent) Programming、Data Structure & Algorithm、Database (综合、MySQL、Oracle)、Performance、Distributed、OS & Hardware、(New) System、其他 等8个大类。然后针对每一个大类,再按照书籍、博客文章、PPT & PDF的形式归类组织。

 

阅读全文…

标签:

并发编程系列之一:锁的意义

十二 23rd, 2013

 

背景

 

C/C++语言的并发程序(Concurrent Programming)设计,一直是一个比较困难的话题。很多朋友都会尝试使用多线程编程,但是却很难保证自己所写的多线程程序的正确性。多线程程序,如果涉及到对共享资源的并发读写,就会产生资源争用(Data Race)。解决资源争用,最直接的想法是引入锁,对并发读写的数据进行保护(更高级的则包括无锁编程—— Lock Free Programming)。但是,锁又有很多种类,例如:自旋锁(Spinlock)、互斥锁(Mutex)、读写锁(Read-Write-Lock)等等。这么多的锁,每种锁有什么特点?对应哪些不同的使用场景?使用过程中需要注意哪些事项?各自分别有哪些不足之处?都是困扰程序员的一个个问题。

 

甚至,一个最基本的问题:为什么锁就能够用来保护共享资源?锁真正蕴含的意义有哪些?我相信很多使用过各种锁的程序员,都不一定能够完全正确的回答出来。

 

有鉴于此,本人希望将自己近10年数据库内核研发,所积累下的并发编程的经验记录下来,形成一个系列的文章,分享给大家。这个系列,个人打算对其命名为 #并发编程系列# ,作为此系列开篇的文章,本文将从一个简单的并发编程的例子出发,引出锁真正蕴含的意义

 

阅读全文…

MySQL 加锁处理分析

十二 13th, 2013

 

1    背景    1

1.1    MVCC:Snapshot Read vs Current Read    2

1.2    Cluster Index:聚簇索引    3

1.3    2PL:Two-Phase Locking    3

1.4    Isolation Level    4

2    一条简单SQL的加锁实现分析    5

2.1    组合一:id主键+RC    6

2.2    组合二:id唯一索引+RC    6

2.3    组合三:id非唯一索引+RC    7

2.4    组合四:id无索引+RC    8

2.5    组合五:id主键+RR    9

2.6    组合六:id唯一索引+RR    9

2.7    组合七:id非唯一索引+RR    9

2.8    组合八:id无索引+RR    11

2.9    组合九:Serializable    12

3    一条复杂的SQL    12

4    死锁原理与分析    14

5    总结    16

 

  1. 背景

 

MySQL/InnoDB的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事咨询这方面的问题。同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题。本文,准备就MySQL/InnoDB的加锁问题,展开较为深入的分析与讨论,主要是介绍一种思路,运用此思路,拿到任何一条SQL语句,都能完整的分析出这条语句会加什么锁?会有什么样的使用风险?甚至是分析线上的一个死锁场景,了解死锁产生的原因。

 

注:MySQL是一个支持插件式存储引擎的数据库系统。本文下面的所有介绍,都是基于InnoDB存储引擎,其他引擎的表现,会有较大的区别。

阅读全文…

C/C++ Volatile关键词深度剖析

十二 2nd, 2013

1    背景    1

2    Volatile:易变的    1

2.1    小结    2

3    Volatile:不可优化的    3

3.1    小结    4

4    Volatile:顺序性    4

4.1    happens-before    6

4.2    小结    7

5    Volatile:Java增强    8

6    Volatile的起源    9

7    参考资料    9

 

  1. 背景

前几天,发了一条如下的微博 (关于C/C++ Volatile关键词的使用建议):


 

此微博,引发了朋友们的大量讨论:赞同者有之;批评者有之;当然,更多的朋友,是希望我能更详细的解读C/C++ Volatile关键词,来佐证我的微博观点。而这,正是我写这篇博文的初衷:本文,将详细分析C/C++ Volatile关键词的功能 (有多种功能)、Volatile关键词在多线程编程中存在的问题、Volatile关键词与编译器/CPU的关系、C/C++ Volatile与Java Volatile的区别,以及Volatile关键词的起源,希望对大家更好的理解、使用C/C++ Volatile,有所帮助。

 

Volatile,词典上的解释为:易失的;易变的;易挥发的。那么用这个关键词修饰的C/C++变量,应该也能够体现出”易变”的特征。大部分人认识Volatile,也是从这个特征出发,而这也是本文揭秘的C/C++ Volatile的第一个特征。

 

阅读全文…

标签: , ,

排队论及其应用浅析

十一 6th, 2013

导读

 

说起【排队论】(Queueing Theory),我的朋友 童家旺 (新浪微博:@jametong)应该是我的启蒙者,在去年的一些交流中,他就多次提到过【排队论】,但是,那时我也是听听就过,也没有深入去了解过究竟什么是【排队论】。

 

今年,在参加数据库大会时,他向我推荐了一篇文章,Cary Millsap写的《Thinking Clearly About Performance》,读过之后,惊为神文。作者原为Oracle Performance组的VP,负责Oracle数据库的性能优化工作。在文中,作者清晰的描述的什么是Performance,以及【排队论】在Performance中的作用,恰好当时我们组正在做自主研发的TNT存储引擎的性能优化工作,因此我就对【排队论】上了心。之后,陆陆续续看了几十篇排队论相关的文章/书籍,对于排队论终于有了基本的认识,个人感觉其非常有用,因此就产生了这篇PPT:《排队论及其应用浅析》。

 

《排队论及其应用浅析》,从【排队论】开始,介绍了【排队论】的起源,解决的问题,经典的排队论系统,排队论中经典的Law(如:Little’s Law)。然后,再进一步展开,介绍了【排队论】在系统设计、性能优化、容量规划等方面的应用。

 

阅读全文…

个人订阅的10佳博客与相关介绍

十一 4th, 2013

前段时间,我在微博上分享了自己订阅的博客Feeds,一共有200个左右,内容覆盖多个领域,包括有:Database(MySQL、Oracle、PostgreSQL),Programming,Distributed Systems,Systems 等。俗话说,过犹不及,太多的选择,往往意味着没有选择。在过去的几年,对于自己订阅的所有博客,我基本上做到每天都看,因此对每个博客的内容有了一定的了解。本文,就准备根据个人的经验,从订阅的这200个博客中,挑选出10个出来,并且为每个挑选出的博客,附上个人对其的简单介绍。一来算是对过去的一个归纳与总结,二来也可以帮助大家更好的挑选。

 

声明:这次的挑选,完全是根据自己的经验与喜好,并不算是什么排名。挑选的标准:

  1. 博客更新的频率;
  2. 博客中好文章的比率;
  3. 博客文章,对我的帮助;
  4. 以下挑选出来的博客,首先按照国际/国内划分,然后按照字母排序介绍;

阅读全文…

标签: ,

CPU Cache and Memory Ordering——并发程序设计入门

七 13th, 2013

CPU Cache and Memory Ordering

内容简介

本PPT,为本人学习CPU架构以及并发程序设计的一些心得与收获。主要内容包括:

 

  •   简单介绍CPU的架构,部分主要模块及其功能(Cache Structure, Cache Line , Set-Way);
  •   Cache Coherence算法 (MESI, MOESI);
  •  CPU Memory Ordering模型 (Atomic,Reorder,Memory Barrier (Compiler, CPU),Lock Instruction,Load Acquire/Store Release);
  •  并发程序设计 (实现一个Spinlock,纠正一个Lock-Free Algorithm,Data Race (False-Sharing, Per-Processor Data));

 

分享地址

新浪微盘

  • PPT格式下载地址:点我
  • PDF格式下载地址:点我

 

说明:推荐下载PPT格式,每页PPT的备注中,都有对应的参考资料,可进行深入的学习。而PDF格式,所有的参考资料,均在最后给出。

 

SlideShare



 

 

 

My sql 5.6新特性深入剖析——innodb引擎

四 12th, 2013

简介

2012-09-29,MySQL 5.6第一个RC版本发布(MySQL 5.6.7),2013-02-05,MySQL 5.6第一个GA版本发布(MySQL 5.6.10)。总的来说,MySQL 5.6算是一个值得期待的版本,包含了大量的新特性,了解这些新特性,不仅对数据库内核研发有帮助,对于更好的使用MySQL数据库也有着极大的意义。

 

因此,本人从2012年初开始,就一直关注MySQL 5.6版本的各个新特性,阅读每一个5.6版本相关的相关博文,下载其最新的版本进行测试验证,积累下了一定的心得与收获,形成了这个介绍MySQL 5.6新特性深入剖析的PPT。本PPT一共分为两期:分别是InnoDB引擎以及MySQL Server。

 

本次为第一期,分享 MySQL 5.6 InnoDB引擎中的性能优化与功能增强。性能优化包括:Read-Only Transaction,Buffer Pool Flushing,Page Cleaner,Purge等;功能增强包括:Online DDL,InnoDB Memcached Plugin,Transportable Tablespaces,Buffer Pool Dump/Restore等;同时,阅读此PPT的过程中,朋友们还可以通过PPT中的链接,深入到每个功能的设计、实现与使用的相关资料,更进一步了解每一个新特性。

 

My sql 5.6新特性深入剖析——innodb引擎

 

新浪微盘地址

 

Slideshare在线观看

 



 

InnoDB Memcached Plugin源码实现调研

四 3rd, 2013

背景

 

MySQL 5.6版本,新增了一个NoSQL的接口,通过将memcached嵌入到MySQL系统之中,用户可以直接使用memcached接口直接操作MySQL中的InnoDB表,绕过MySQL Server层面的SQL解析,优化,甚至绕过InnoDB Handler层,直接操作InnoDB内部的方法,从而达到更优的响应时间与效率。关于此功能的官方介绍,请见:InnoDB Integration with memcached 。嵌入memcached之后,整个MySQL的架构如下图所示:

 

 

本文接下来的部分,将从源码的角度,详细分析InnoDB Integration with memcached的实现细节问题。

 

导读

 

  • InnoDB引擎为了支持Memcached API,在Handler层面进行的改动,请见(一)


  • Memcached Plugin的初始化流程,请见(二)

 

  • InnoDB提供的Callback方法在InnoDB Handlerton中的data中以及Memcached Plugin的data中,是如何传递的呢?请见(三)

 

  • InnoDB Memcached Engine提供的方法集合,请见(四)

 

  • InnoDB Memcached Engine提供的方法,如何调用到InnoDB Engine提供的方法,请见(五)

 

  • InnoDB Memcached Engine中,存在两个Engine实例:InnoDB Engine vs Default Engine,二者的功能异同,请见(六)

 

  • InnoDB Memcached Engine中,需要配置Container Table,Container表详解,请见(七)

 

  • InnoDB Memcached Engine的初始化与使用流程,可参考engine_testapp.c测试文件;

阅读全文…