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

上传人:lao****ou 文档编号:81633 上传时间:2023-02-13 格式:DOCX 页数:5 大小:13.46KB
下载 相关 举报
MYSQL删除不存在的数据造成死锁.docx_第1页
第1页 / 共5页
MYSQL删除不存在的数据造成死锁.docx_第2页
第2页 / 共5页
MYSQL删除不存在的数据造成死锁.docx_第3页
第3页 / 共5页
MYSQL删除不存在的数据造成死锁.docx_第4页
第4页 / 共5页
MYSQL删除不存在的数据造成死锁.docx_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《MYSQL删除不存在的数据造成死锁.docx》由会员分享,可在线阅读,更多相关《MYSQL删除不存在的数据造成死锁.docx(5页珍藏版)》请在第一文库网上搜索。

1、删除不存在的数据造成死锁笫34章介绍了如何查看死锁日志,但案例中死锁的场景还是很简单的,属于教科书版本的死锁。本章将通过一个案例来加深读者对RR隔离级别下加锁规则的理解,阅读死锁日志,能够将理论知识运用到实际中。问题现象不管是开发人员还是DBA, 一定都听说过不建议使用RR (REPEATABLE-READ)隔离级别这个规范。如果你是开发人员,问DBA为何这样做?可能得到的答案是:容易产生死锁,或者容易产生锁等待。在MySQL中RR隔离级别下的GAP锁确实是一个很容易,踩坑”的地方,如果不了解GAP锁的机制,就很容易造成锁等待或者死锁,本章我们就来分析一个删除不存在的数据造成死锁的案例,通过这

2、个案例让大家更深入地了解在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

3、 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

4、; 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 12314552897126

5、4, 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 0

6、0000005; 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

7、 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的这条记录上持

8、有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户申请插入

9、意向锁时与事务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.LO

10、CK.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),这时插入的值在这个范围内都会被阻

11、塞,原因是防止在这个范围内再有新的数据插入造成幻读。当执行“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

12、但是当插入的记录不在(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 V

13、ALUES (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锁加深印象。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 应用文档 > 汇报材料

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

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

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



客服