您好、欢迎来到现金彩票网!
当前位置:彩66彩票app下载 > 隔离级 >

InnoDB RR隔离级别下INSERT SELECT两种死锁案例剖析

发布时间:2019-04-24 09:16 来源:未知 编辑:admin

  有网友遇到了在RR隔离级别下=** 发生死锁的问题。分析死锁日志后,笔者模拟重现了2种可能引发死锁的场景,本文中将进行详细的描述。

  本文使用版本Percona 5.7.14修改版,能够打印出事务所有的行锁信息结构链(不包含隐含锁);

  本文使用了自制工具innblock和bcview,前者用于扫描块结构,后者用于更加方便的查看二进制文件信息。两个工具下载地址:

  在开始正文之前我打算介绍一下一些基本概念,特别是锁模型和兼容矩阵会对本文的阅读有相当大的帮助。

  一个page中总是包含这两个伪记录。 页中所有未删除(或删除但还未purged)的行逻辑上都链接到这两个伪记录之间,表现为一个逻辑链表数据结构,其中supremum伪记录的锁始终为next-key lock。

  heap no存储在fixed_extrasize 中。 heap no 为物理存储填充的序号,页的空闲空间挂载在page free链表中(头插法),空闲heap可以重用,但是重用时heap no不变。如果一直是insert 则heap no 不断增加。heap并不是按照ROWID(主键)排序的逻辑链表顺序,而是物理填充顺序。

  和这个page相关的锁位图的大小,每一行记录都有1 bit的位图信息与其对应,用来表示是否加锁,并且始终预留64bit。 例如我的表有9条数据,外加infimum和supremum虚拟记录,即 64+9+2 bits = 75bits,但它还必须被8整除(为了向上取整为一个字节),最后结果也就是80 bits(8 bytes)。注意:不管是否加锁,每行都会对应1 bit。

  一般来说,innodb表上锁时都会对表级加上IX,这占用一个结构体。然后分别对二级索引和主键进行加锁,每一个BLOCK会占用这样一个结构体。

  这个信息描述了当前事务加锁的行数,它是所有lock struct结构体中排除table lock以外所有加锁记录的总和,并且包含了infimum和supremum伪记录。

  细心的朋友应该会发现在show engine innodb status 输出中,在对大量行进行加锁时,事务信息中的row lock会不断的增加。这是因为加行锁最终会调用lock_rec_lock逐行加锁,这也会增加了大数据量加锁的触发死锁的可能性。

  多个线程(会话)之间加锁对象必须有相互等待的情况发生,并且等待出现环状。

  由于存在对 SELECT 符合条件的数据加上LOCK_S锁的情况,RR模式下 INSERT SELECT 出现死锁的概率无疑更高。我通过测试模拟出死锁结果,严格意义上说,这是相同的语句在高并发情况下表现为两种死锁结果。

  TX1:执行update需要获得表b主键id=999的LOCK_X显然这个记录已经被TX2加锁LOCK_S,只能等待,触发死锁检测

  场景二需要在特定的高并发下才会出现,因为在 高并发场景下,很难认为控制 INSERT SELECT (逐行加锁的)过程,没办法让它在特定条件下停止,好让我们对其进行观察。

  因此,为了能够模拟出这种情况,笔者对innodb增加了4个参数用于设置加锁断点(加锁过程中临时sleep下):

  这样一旦判定为符合条件的记录,本条记录加锁前便会睡眠指定时长。如果我们设定在LOCK_S:id=2997之前睡眠30秒,那么场景二必定发生如下图所示加锁过程:

  我们按照插入顺序推断出heap_no 84就是id=2997的记录。我们使用另外一个工具bcview进行验证:

  通过死锁日志明显能看出同样的语句报出来的死锁信息却不一样,确认在高并发下相同语句,两种死锁场景都是可能发生的。

  在重现死锁过程的时候,必须要做到和线上死锁信息完全匹配,这个死锁场景才算测试成功了。从本次的例子我们就发现,同样的语句产生的死锁信息却不一样,我们当然就要按照不同的场景去考虑。 本文中的 场景二 比较复杂,一般只是在高并发先出现,测试也相对麻烦。本文通过修改源码的方式进行测试的,否则很难重现。

  最后,找到死锁原因后就需要采取必要的措施,比如本文中的例子需要考虑几个方案:

  INSERT SELECT是否可以用其他方式代替,因为这种语句在自增锁上也存在一定风险;

  是否考虑使用RC隔离级别,在RC隔离级别下不存在对SELECT表记录加锁的情况。

  最后再强调一点,对于出现LOCK_S这样的锁最好深入分析,因为这种锁并不多见。返回搜狐,查看更多

http://article12.net/geliji/29.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有