范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Mysql的死锁与索引的关系

  前言
  在工作过程中,我们经常会碰到mysql的死锁问题,也是我们非常头疼的问题,今天老顾尝试着和小伙伴们一起学习一下mysql锁的相关知识点。 锁分类
  我们经常说的就是  表锁 、以及 行锁 表锁:对整张表加锁
  行锁:对表中的某条记录加锁
  mysql数据库引擎支持的锁类型是不同的 MyISAM 只支持到表级锁 InnoDB 可以支持到行级锁 表锁
  对整张表加锁,锁的颗粒度大,资源消耗小,并发请求低;表锁有2种模式:
  1、表共享锁:对同一表的不阻塞读,但阻塞写。
  2、表独占锁:对同一表的操作,不管是读写,都阻塞。
  共享锁
  独占锁
  共享锁
  兼容
  冲突
  独占锁
  冲突
  冲突 显式加表锁:lock tables {tb_name} read/write 显式释放锁:unlock tables行锁
  我们今天的重点就是行锁,也就是死锁的根源所在。行级别的锁颗粒度小,开销比较大 锁模式:
  1、共享锁(读锁)S锁: 对同一行的操作,读不阻塞,写阻塞
  2、排他锁(写锁)X锁: 对同一行的操作,读写都阻塞
  3、意向共享锁IS: 一个事务想要加S锁,首先先获得该表的IS锁
  4、意向排他锁IX: 一个事务想要加X锁,首先先获得该表的IX锁
  意向锁本质就是表锁,那为什么要有意向锁呢?
  意向锁用来标识该表上有数据被加锁或将被加锁,对于表级别的请求(lock table....),就可以直接判断是否有锁冲突,不需要逐行检查锁的状态
  S锁
  X锁
  IS锁
  IX锁
  S锁
  兼容
  冲突
  兼容
  冲突
  X锁
  冲突
  冲突
  冲突
  冲突
  IS锁
  兼容
  冲突
  兼容
  兼容
  IX锁
  冲突
  冲突
  兼容
  兼容 InnoDB锁方式
  InnoDb的 默认隔离级别RR(可重复读) ,在RR下读取数据的方式:
  1、快照读: 事务 开启执行第一个SELECT语句后会获取一个数据快照,直到事物结束读取到的数据都是一致的
  普通的 select… 查询都是快照读
  2、当前读: 读取的数据的最新版本,并且在读的时候不允许其它事物修改当前记录
  select… lock in share mode(S锁)select… for update(X锁)
  加锁方式: 普通 select… 查询 (不加锁) 普通 insert、update、delete… (隐式加写锁) select…lock in share mode (加读锁) select…for update (加写锁)
  解锁方式: 提交/回滚事物(commit/rollback) kill 阻塞进程 锁与索引
  InnoDB的行锁是通过给索引上的 索引项加锁来实现 的
  即使在建表的时候没有指定主键,InnoDB会默认创建一个DB_ROW_ID的自增字段为表的主键,并且其主键索引(聚簇索引)为GEN_CLUST_INDEX
  主键索引也被称为聚簇索引行锁类型Record Lock: 对对应的索引 记录项加锁,称记录锁 Gap Lock:对 索引项之间的间隙加锁 ,加锁之后 间隙范围内不允许插入数据,防止发生幻读 Next-key Lock:可以理解为Record Lock+Gap Lock(InnoDB行锁默认加的是 Next-key Lock) 记录锁
  这个比较好理解,就是把表中的记录锁定。 间隙锁
  编程的思想源于生活,生活中的例子能帮助我们更好的理解一些编程中的思想。
  生活中排队的场景,小明,小红,小花三个人依次站成一排 ,此时,如何让 新来的小刚不能站在小红旁边 ,这时候 只要将小红和她前面的小明之间的空隙封锁,将小红和她后面的小花之间的空隙封锁 ,那么小刚就不能站到小红的旁边。
  这里的小红,小明,小花,小刚就是数据库的一条条记录。
  他们之间的空隙也就是间隙,而封锁他们之间距离的锁,叫做间隙锁。 加锁规则
  行级锁默认加 next-key lock ,查询过程中访问到的索引项都会加锁,而根据 不同的索引也有不同的加锁规则 : 唯一索引等值查询:
  当索引项存在时,next-key lock 退化为 record lock;
  当索引项不存在时,默认 next-key lock,访问到不满足条件的第一个值后next-key lock退化成gap lock 唯一索引范围查询:
  默认 next-key lock,(特殊’<=’ 范围查询直到访问不满足条件的第一个值为止) 非唯一索引等值查询:
  默认next-key lock ,索引项存在/不存在都是访问到不满足条件的第一个值后next-key lock退化成gap lock 非唯一索引范围查询:
  默认 next-key lock,向右访问到不满足条件的第一个值为止
  针对这几种情况分别举例说明一下,假设我有以下数据:
  id
  name
  age
  1
  张三   21
  4
  王一   26
  6
  小军   18
  9
  小红   23
  在上面的数据表我们可以得到5个next-key lock 区间:   唯一索引(id):(- ,1],(1,4],(4,6],(6,9] ,(9,+supremum]   非唯一索引(age):(- ,18],(18,21],(21,23],(23,26] ,(26,+supremum] 案例:唯一索引等值查询索引项存在eg:select * from user where id=4 for update   加锁情况:   默认加next-key lock (1,4],因索引项存在,则next-key lock退化为 record key,只对id=4的这个索引项的record key 索引项不存在eg:select * from user where id=5 for update   加锁情况:   默认加next-key lock (4,6],访问不满足条件id=6后next-key lock退化为grap lock,加锁范围(4,6) 案例:唯一索引范围查询eg: ">" select * from user where id > 4 for update   加锁情况:默认 next-key lock (4,6],(6,9],(9,+suprenum] eg: "<" select * from user where id < 4 for update   加锁情况:默认 next-key lock (- ,1],(1,4] eg: ">=" (可以拆成 > 和 =) select * from user where id >= 4 for update   加锁情况:   ">4": 范围查询 默认 next-key lock (4,6],(6,9],(9,+suprenum]   "=4": 等值查询 默认next-key lock退化为 record key,id=4的索引项   ‘>=4’: 合并在一起加锁范围为: [4,6],(6,9],(9,+suprenum] eg: "<="(可以拆成 < 和 =) select * from user where id <= 4 for update   加锁情况:   ‘<4’: 范围查询 默认 next-key lock (- ,1],(1,4],这里有点特殊范围查询,需要访问不满足条件(<=4)的第一个值为止,因此找到了6;加锁范围 (- ,1],(1,4],(4,6]   "=4": 等值查询 默认next-key lock退化为 record key,id=4的索引项   ‘<=4’: 合并在一起加锁范围为: (- ,1],(1,4],(4,6] 案例:非唯一索引等值查询索引项存在eg:select * from user where age=21 lock in share model   加锁情况:   默认加next-key lock (18,21], (21,23];   访问到不满足条件age=23后next-key lock退化为grap key   加锁范围(18,21], (21,23) 索引项不存在eg:select * from user where age=19 lock in share model   加锁情况:   默认加next-key lock (18,21],   访问不满足条件age=21后next-key lock退化为grap lock   加锁范围(18,21) 案例:非唯一索引范围查询eg:">" select * from user where age > 21 lock in share model   加锁情况:   默认加next-key lock (18,21], (21,23],(23,26], (26,+suprenum],   向右访问到不满足条件第一个值为止 (18,21], (21,23],(23,26], (26,+suprenum]   加锁范围 (18,21], (21,23],(23,26], (26,+suprenum] eg:"<" select * from user where age < 21 lock in share model   加锁情况:   默认加next-key lock (- ,18], (18,21],   向右访问到不满足条件第一个值为止 (- ,18], (18,21],(21,23]   加锁范围 (- ,18], (18,21],(21,23] eg:">=" (可以拆成 > 和 =) select * from user where age >= 21 lock in share model   加锁情况:   ‘> 21 ’ 范围查询 (18,21], (21,23],(23,26], (26,+suprenum]   "= 21" 等值查询 (18,21], (21,23)   合并加锁范围 (18,21],(21,23],(23,26], (26,+suprenum] eg:"<="(可以拆成 < 和 =) select * from user where age < 21 lock in share model   加锁情况:   ‘< 21 ’: 范围查询 (- ,18], (18,21], (21,23]   ‘= 21 ’: 等值查询 (18,21], (21,23)   合并加锁范围 (- ,18], (18,21],(21,23]   细心一点你会发现上面例子中:   唯一索引的查询用的是 select … for update   非唯一索引的查询用的是 select … lock in share modelfor update 加的是写锁,写锁默认认为会对数据做更改,不管查询有没有涉及到回表都会对聚簇索引(主键索引)加锁 lock in share model 加的是读锁,如果没有涉及到回表(像覆盖索引),不会对聚簇索引(主键索引)加锁   如果上面例子中非唯一索引的查询用的是 select … for update,还需要分析聚簇索引(主键索引)的加锁情况(可参考文章https://www.jianshu.com/p/bf862c37c4c9)死锁   死锁指的是两个或两个以上的事物在执行过程中争抢锁资源而造成相互等待的情况   表锁不会出现死锁,主要还是针对InooDB的行锁,可以看下面的例子:   会话A与会话B 互相产生了死锁。 监控分析锁问题# 查询InnoDB锁的整体情况 # 可以重点查看Innodb_row_lock_waits和Innodb_row_lock_time_avg这两个值 # 如果数值较大,说明锁之间的竞争大 show status like "innodb_row_lock%"; #可以通过INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS这三个表 #分析可能存在的锁的问题 select * from information_schema.INNODB_TRX; # 查看所有事务 select * from information_schema.INNODB_LOCKS; # 查看锁 select * from information_schema.INNODB_LOCK_WAITS; # 查看锁等待   解决死锁:   超时等待,事物超时自动回滚(innodb_lock_wait_timeout 默认50s)   主动死锁检测,事物请求锁的时候采用 wait-for graph 等待图的方式进行死锁检测(innodb_deadlock_detect 默认on)   发现死锁也可以人为 kill 进程 总结MySQL锁分为全局锁、表级锁以及行级锁,不同的存储引擎支持锁的粒度有所不同,MyISAM 只支持到表级锁,InnoDB 则可以支持到行级锁,锁的粒度决定了业务的并发度,因此更推荐使用InnoDB InnoDB默认最小加锁粒度为行级锁,并且锁是加在索引上, 如果SQL语句未命中索引,则走聚簇索引的全表扫描,表上每条记录都会上锁,导致并发能力下降,增大死锁的概率 ,因此需要为表合理的添加索引, 线上查询尽量命中索引 行级锁默认加 next-key lock,而 根据不同的索引也有不同的加锁规则 ,我们可以根据加锁规分析加锁区间 锁粒度的减小提高了并发度的同时也增加了死锁的风险,查询应尽量考虑减少锁的范围

手机摄影,你拍到过哪些好看的照片,可以分享一下么?我拍到好看的相片太多太多了,数都数不清,出去外面玩,我就爱拍,拍照片就是我的最爱,最喜欢拍花花草草。手机拍风光照片比单反相机要方便很多,看见就可以即时拍摄,而且画面很宽有大片感觉。网友2200元入手iPhoneXSMax,只有两个严重问题网上有很多低价iPhone,要么是骗子,要么就是手机有重大问题。比如今天这台iPhoneXSMax,网友仅用2200元就拿下了!关键还是国行版本,内存还是256GB。如果是一台正常年轻人的第一台OLED电视,小米电视新品发布,网友有点小贵很多朋友选购电视时,不知道该如何抉择,如何才能挑选一款画质出众的产品,成为困扰消费者的主要问题。因为智能手机的普及,人们使用电视的频率逐渐下降,但电视依旧是每个家庭必不可少的家电之荣耀50Pro全新配色荣耀密码2699元起荣耀8月30日,发布了荣耀50Pro全新配色,荣耀密码。荣耀50,6。57英寸OLED超曲屏。10。7亿色。120Hz屏幕刷新率,300Hz触控采样率。高通骁龙778G处理。320凑齐5台4。7寸的iPhone手机,实属不易,来波回忆杀在家里收拾百宝箱,居然发现3台4。7寸的iPhone4。7手机,分别是iPhone6iPhone6siPhone7,于是突发奇想,为何不把苹果到目前为止,所发布的这5台4。7寸的i买投影仪什么牌子好?IT控分享五大高性价比投影仪推荐最近收到很多小伙伴询问买投影仪什么牌子好?今天IT控老张又带来了一期干货满满的测评!从老张过去十年的IT数码玩机经验来看,投影仪在不同品牌不同类型之间体验确实存在差异,想要挑选一款谷歌发售新品手机Pixel5a,十年前的设计被称之为极为先进谷歌此前发布了一款中低端手机谷歌Pixel5a,售价449美元也就是相对于2900元的产品,并于8月28日开售,相比而言,这款手机配备了更大的电池,更大的屏幕以及防水性能,同时支持AppleWatch遥控手机技巧分享拍照找手机上期小编跟大家聊的话题是关于AppleWatch的个性化表盘设置,本期我们的主角依然是AppleWatch哦。但是在内容上主要围绕怎么遥控手机来聊,下面让我们一起来看一下吧1。遥控手机系统应用软件更新升级的那些事,你知道吗?大家好!今天来说一下手机系统以及应用软件更新升级的那些事,在网络信息高度发达的今天,手机成为了我们人手必备的,如今不带手机出门,感觉寸步难行。手机系统升级OTA升级方式是我们使用最除甲醛除异味多项全能!Taotronics空气净化器上手简记对于很多人来讲,不管是入住新家还是日常生活,好的居家环境都是必须的。尤其是新家或者家里有呼吸敏感者,对于良好的家庭环境要求就变成了刚需。搬入新房以后,我越来越觉得有一款净化器是很必马云收了河北慧眼医药科技公司如何运作的?中国第一个第三方网上药品交易资格证,没给京东,没给天猫,出人意料地,2013年11月12日,国家药监局将这个试点牌子给了河北一家名不见经传的医药公司河北慧眼医药科技有限公司9509
丰田集团一口气发布15款纯电车,未来将停售燃油车,被惊讶到了吗如果说哪个品牌对于纯电车的热情最低,那莫过于丰田了。在玩车弟的印象里,丰田章男不止一次表示过对纯电车的不喜爱。而就在近日,丰田章男却亲自开了一场发布会,并发布了十五款纯电概念车型,上班需要学会的办公软件有哪些?你学会几个了?这个不能一概而论,需要结合你的专业进行考虑。一文科毕业生文科生到了企业,大部分在办公室工作,我以前也曾在机关混过。机关办公室里常用的办公软件主要就是office系列软件了。常用的有拆解旧收音机教程今天准备拆一个旧收音机给大家讲解一些教程。这是一个是文字的正面看,它的表面的按钮应该功能还挺多,不仅仅有收音机的功能,应该还具有MP3MP4播放的功能。背面图看完背面和正面发现这个价格不得上天?苹果15吋iPad曝光能兼容Mac应用12月20日消息,在最新一期PowerOn节目中,彭博社记者MarkGurman强调,苹果即将推出一款屏幕巨大的iPad,用做智能生态核心,预计尺寸可达15英寸,竞争对手是亚马逊E小米12系列即将上市!这三款小米旗舰值得入手,你更看好哪一款最近小米12系列则是得到了不少用户的关注,不出意外它很快就要上市了,当下还是有很多用户对它有了一定程度的了解。不过若是因为经济方面的原因不能购买这款手机的话,大家不妨去关注一下其他光伏新能源突然崩了A股是洗盘还是真跌?这两天市场上事情太多了,先是吃了个蕾神之锤大战宏慌之力的瓜,这瓜还没结束。就是中植系的老前辈意外离世,让很多人都大致忘掉了,就在前一周周五高层还要查假北向的事情了。但是周一了,A股高盛对百度(9888。HK)增长前景乐观维持买入评级高盛发表研究报告指出,虽然宏观环境及新冠肺炎疫情为百度SW(9888。HK)带来短期不确定性,但该行仍然对其长期增长前景保持乐观,认为公司月活跃用户数量稳定增加和移动生态系统扩张,独家助三叉星加速电动化转型孚能或已完成向奔驰固液混合电池送样财联社(北京,记者刘阳)讯,将固态电池技术量产应用吸引着所有汽车制造商,奔驰亦不例外。孚能科技的固液混合电池(A样)已经给奔驰方面送样了。12月20日,有业内知情人士向财联社记者透微服务项目到底如何分模块?企业级项目结构封装释义如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块分布式这类的概念,那么多半会傻眼。为什么一个项目会有这么多iPhoneSE3将试产,或是苹果旗下最便宜的5G手机文明美无限现在的手机的尺寸,大部分是超过了5英寸,不过呢,很多人也很怀恋多年前的小屏手机,而在手机行业,目前安卓品牌似乎没有太多的小屏手机可以选择,倒是苹果手机,一般都有小屏的产品飞傲M17旗舰播放器开箱评测台机的音质,手机的操作体验让产品好玩点,让结果直接点,有料评测只做你最关心的评测内容。售价11999元的M17是飞傲历史上最贵的播放器,也是飞傲历史上体积最大的一款随身播放器产品。M17是飞傲在播放器领域上