欢迎来到第一文库网! | 帮助中心 第一文库网-每个人都是第一
第一文库网
全部分类
  • 研究报告>
  • 学术论文>
  • 全科教育>
  • 应用文档>
  • 行业资料>
  • 企业管理>
  • 技术资料>
  • 生活休闲>
  • ImageVerifierCode 换一换
    首页 第一文库网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    MYSQL删除不存在的数据造成死锁.docx

    • 资源ID:136934       资源大小:13.45KB        全文页数:5页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: QQ登录 微博登录
    二维码
    扫码关注公众号登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    MYSQL删除不存在的数据造成死锁.docx

    删除不存在的数据造成死锁笫34章介绍了如何查看死锁日志,但案例中死锁的场景还是很简单的,属于教科书版本的死锁。本章将通过一个案例来加深读者对RR隔离级别下加锁规则的理解,阅读死锁日志,能够将理论知识运用到实际中。问题现象不管是开发人员还是DBA, 一定都听说过不建议使用RR (REPEATABLE-READ)隔离级别这个规范。如果你是开发人员,问DBA为何这样做?可能得到的答案是:容易产生死锁,或者容易产生锁等待。在MySQL中RR隔离级别下的GAP锁确实是一个很容易,踩坑”的地方,如果不了解GAP锁的机制,就很容易造成锁等待或者死锁,本章我们就来分析一个删除不存在的数据造成死锁的案例,通过这个案例让大家更深入地了解在RR隔离级别下为何会容易造成锁等待或者死锁。大家可能很难理解删除不存在的数据是如何造成死锁的,下面我们一起来分析,先看一下复现后的死锁日志:(1) TRANSACTION:TRANSACTION 2*7685, ACTIVE 43 sec insertingmysql tables in use 1, locked 1LOCK WAIT 3 lock struct (s) 9 heap size 1200, 2 row lock (s)MySQL thread id 81z OS thread handle 123145529880576, query id 4475 localhost root updateINSERT INTO tl VALUES (2)* (1) WAITING FOR THIS LOCK TO BE GRANTED:RECORD LOCKS space id 39 page no 4 n bits 72 index PRIMARY of table *dhy'.'tl' trx id27685 lock_mode X locks gap before rec insert intention waitingRecord lock, heap no 3 PHYSICAL RECORD: n_fields 3; compact format; info bits 00: len 4; hex 00000005; asc;1: len 6; hex 000000006clb; asc 1 ;2: len 7; hex 01000000elll33; asc 3; (2) TRANSACTION:TRANSACTION 27686, ACTIVE 28 sec insertingmysql tables in use 1, locked 13 lock struct(s)r heap size 1200, 2 row lock(s)MySQL thread id 82, OS thread handle 123145528971264, query id 4476 localhost root updateINSERT INTO tl VALUES (4)* (2) HOLDS THE LOCK(S):RECORD LOCKS space id 39 page no 4 n bits 72 index PRIMARY of table 'dhy'.'tl' trx id27686 lock_mode X locks gap before recRecord lock/ heap no 3 PHYSICAL RECORD: n_fields 3; compact format; info bits 00: len 4; hex 00000005; asc ;1: len 6; hex 000000006clb; asc 1 ;2: len 7; hex 01000000elll33; asc 3;* (2) WAITING FOR THIS LOCK TO BE GRANTED:RECORD LOCKS space id 39 page no 4 n bits 72 index PRIMARY of table dhyw.trx id27686 lock_mode X locks gap before rec Insert intention waitingRecord lock, heap no 3 PHYSICAL RECORD: n_fields 3; compact format; info bits 00: len 4; hex 00000005; asc ;1: len 6; hex 000000006clb; asc 1 ;2: len 7; hex 01000000elll33; asc 3; WE ROLL BACK TRANSACTION (2)问题分析在第34章中我们已经会了如何查看死锁日志,从这个死锁日志中可以看出,事务27685在执行INSERT语句申请插入意向锁时发生了锁等待,插入的语句是“INSERT INTOtl VALUES (2fo事务27686在主键值为5的这条记录上持有GAP锁,GAP锁的范围应是(x,5), x代表未知。因为如果在主键值为5的这条记录之前还有其他记录,则GAP锁的范围为从x到5, Cfclock_mode X locks gap before rec”代表X-GAP锁。同时事务27686在执行“INSERT INT6 tl VALUES (4)”语句申请插入意向锁时发生了锁等待,且可以看到锁等待记录的主键值是5,则说明事务27685持有主键值为5这条记录上的间隙锁,锁定的范围是(x,5)。根据上面分析可以得知,两个事务分别对表上主键值为5的记录持有了GAP锁,事务27685在执行“INSERT INTO tl VALUES (2户申请插入意向锁时与事务27686持有的GAP锁发生冲突,之后事务27686在执行“INSERT INTO tl VALUES (4广时同样与事务27685持有的GAP锁发生了冲突,此时两个事务都在互相申请对方的锁而不能释放造成了死锁。问题扩展我们通过死锁日志分析出死锁的原因,但还需要继续分析为何删除不存在的数据也会造成死锁。前面我们分析GAP锁的范围是(x,5),这个范围是如何产生的?例如,表中有两条记录id=l,id=5,执行“DELETE FROM Tl WHERE ID =2”加锁的情况如图351所示(通过MySQL 8.0中的performance.dataocks表)。| CHGINE.LOCK.IO |ENGINE.TRANSACTIOM.ZO |THREAD.XO |063ECT.SCHFMAOBJECT.NAM| INDEX.HAME | LOCK.TYPE| LOCK.HOOE| LOCK.STATUS| LOCK.OATA |.-a| 20235:|28225 !M |dhy1tl1 ML| TABlfc11X| GRANTED1 Wil1| 28225:39:4:3|2S225 |54 |dhytl| PRIMARY| RECORD1 X.GAP| GRANTED图 35-1在主键值为5的记录上添加了GAP锁,锁定的范围应是(1,5),这时插入的值在这个范围内都会被阻塞,原因是防止在这个范围内再有新的数据插入造成幻读。当执行“INSERT INTO tl VALUES (3户时,id=3这条记录在范围(1,5)内,所以会发生锁等待。加锁情况如图35-2所示。IOCK.I| OBJtX-U11 10B3tCT_»UWINDCX.NAfltOCK.TOCK.NOOEXX.,ocx.c1| |“726 |S51 6丫1tl| NULL1fme一 J1XX| GMAMTID| IML1| |加“ |S51 Gy1tl| MIMARV1WCOTO(L| waitingno11|M1 Mv1tl| NUU1vAstrl11| GMTtO| NUU1I ony图 35-2但是当插入的记录不在(1,5)范围内时,则不会发生锁等待。mysql> INSERT INTO tl VALUES (0);Query OK, 1 row affected (0.00 sec)可以看出,当删除的记录不存在时,GAP锁的范围会比较大,很容易造成锁等待。如果表中在id=l与id=5之间还存在值,则会将锁定的范围减小,但是如果删除的记录比id=5这条记录大,则锁定的范围将是(5,+8)。表结构及操作步骤表结构及数据如下:mysql> CREATE TABLE tl (id int unsigned NOT NULL PRIMARY KEY);mysql> INSERT INTO tl VALUES (1), (5);操作步骤如表35.1所示。Se工疝m 1Session 2START TRANS AEON;DI2LI1TI2 FROM tL WllliRli id = 2;START TRANSACTION;DELETE FROM H WHERE id = 4;INSERT INTO tl VALUES ;INSERT INTO tl VALUES (4);"发生死锁表 35-1小章小结通过这个案例介绍,相信你对不建议使用RR隔离级别这个规范有了一定的了解。在RR隔离级别下我们要深刻理解GAP锁的范围,有时候发生死锁就是由于我们一时的疏忽。此案例中对于删除不存在的数据这种情况,如果我们对GAP锁没有深刻的认识,则在开发应用程序时很容易发生死锁这种问题,大家可以结合第20章中介绍的各种加锁实验,逐渐对GAP锁加深印象。

    注意事项

    本文(MYSQL删除不存在的数据造成死锁.docx)为本站会员(lao****ou)主动上传,第一文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知第一文库网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 001doc.com网站版权所有   

    经营许可证编号:宁ICP备2022001085号

    本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有,必要时第一文库网拥有上传用户文档的转载和下载权。第一文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知第一文库网,我们立即给予删除!



    收起
    展开