生活工程体验信仰哲学精神
投稿投诉
精神世界
探索历史
哲学文学
艺术价值
信仰创造
境界审美
体验技术
技能工具
工程信息
医学生产
生活运用
操作能力

如何搞定MySQL(全局锁表级锁行级锁)这篇文章告诉你答案!

10月26日 不回头投稿
  概述
  锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、IO)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
  MySQL中的锁,按照锁的粒度分,分为以下三类:全局锁:锁定数据库中的所有表。表级锁:每次操作锁住整张表。行级锁:每次操作锁住对应的行数据。全局锁介绍
  全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。
  其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。
  为什么全库逻辑备份,就需要加全就锁呢?
  A。我们一起先来分析一下不加全局锁,可能存在的问题。
  假设在数据库中存在这样三张表:tbstock库存表,tborder订单表,tborderlog订单日志表。
  在进行数据备份时,先备份了tbstock库存表。然后接下来,在业务系统中,执行了下单操作,扣减库存,生成订单(更新tbstock表,插入tborder表)。然后再执行备份tborder表的逻辑。业务中执行插入订单日志操作。最后,又备份了tborderlog表。
  此时备份出来的数据,是存在问题的。因为备份出来的数据,tbstock表与tborder表的数据不一致(有最新操作的订单信息,但是库存数没减)。
  那如何来规避这种问题呢?此时就可以借助于MySQL的全局锁来解决。
  B。再来分析一下加了全局锁后的情况
  对数据库进行进行逻辑备份之前,先对整个数据库加上全局锁,一旦加了全局锁之后,其他的DDL、DML全部都处于阻塞状态,但是可以执行DQL语句,也就是处于只读状态,而数据备份就是查询操作。那么数据在进行逻辑备份的过程中,数据库中的数据就是不会发生变化的,这样就保证了数据的一致性和完整性。语法
  加全局锁
  数据备份mysqldumpurootp1234itcastitcast。sql
  释放锁特点
  数据库中加全局锁,是一个比较重的操作,存在以下问题:如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟。
  在InnoDB引擎中,我们可以在备份时加上参数singletransaction参数来完成不加锁的一致性数据备份。mysqldumpsingletransactionurootp123456itcastitcast。sql表级锁介绍
  表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中。
  对于表级锁,主要分为以下三类:表锁元数据锁(metadatalock,MDL)意向锁表锁
  对于表锁,分为两类:表共享读锁(readlock)表独占写锁(writelock)
  语法:加锁:locktables表名readwrite。释放锁:unlocktables客户端断开连接。
  特点:
  A。读锁
  左侧为客户端一,对指定表加了读锁,不会影响右侧客户端二的读,但是会阻塞右侧客户端的写。
  测试:
  B。写锁
  左侧为客户端一,对指定表加了写锁,会阻塞右侧客户端的读和写。
  测试:
  结论
  读锁不会阻塞其他客户端的读,但是会阻塞写。写锁既会阻塞其他客户端的读,又会阻塞其他客户端的写。元数据锁
  metadatalock,元数据锁,简写MDL。
  MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。为了避免DML与DDL冲突,保证读写的正确性。
  这里的元数据,大家可以简单理解为就是一张表的表结构。也就是说,某一张表涉及到未提交的事务时,是不能够修改这张表的表结构的。
  在MySQL5。5中引入了MDL,当对一张表进行增删改查的时候,加MDL读锁(共享);当对表结构进行变更操作的时候,加MDL写锁(排他)。
  常见的SQL操作时,所添加的元数据锁:
  对应SQL
  锁类型
  说明
  locktablesxxxreadwrite
  SHAREDREADONLYSHAREDNOREADWRITE
  select、selectlockinsharemode
  SHAREDREAD
  与SHAREDREAD、SHAREDWRITE兼容,与EXCLUSIVE互斥
  insert、update、delete、selectforupdate
  SHAREDWRITE
  与SHAREDREAD、SHAREDWRITE兼容,与EXCLUSIVE互斥
  altertable
  EXCLUSIVE
  与其他的MDL都互斥
  演示:
  当执行SELECT、INSERT、UPDATE、DELETE等语句时,添加的是元数据共享锁(SHAREDREADSHAREDWRITE),之间是兼容的。
  当执行SELECT语句时,添加的是元数据共享锁(SHAREDREAD),会阻塞元数据排他锁(EXCLUSIVE),之间是互斥的。
  我们可以通过下面的SQL,来查看数据库中的元数据锁的情况:selectobjecttype,objectschema,objectname,locktype,lockdurationfromperformanceschema。
  我们在操作过程中,可以通过上述的SQL语句,来查看元数据锁的加锁情况。mysqlselectobjecttype,objectschema,objectname,locktype,lockdurationfromperformanceschema。objecttypeobjectschemaobjectnamelocktypelockdurationTABLEMySQLAdvancedtbuserSHAREDREADTRANSACTIONTABLEMySQLAdvancedtbuserSHAREDREADTRANSACTIONTABLEMySQLAdvancedtbuserSHAREDWRITETRANSACTIONTABLEMySQLAdvanceduserlogsSHAREDWRITETRANSACTIONTABLEperformanceschemametadatalocksSHAREDREADTRANSACTION5rowsinset(0。00sec)。。。阻塞
  另开一个客户端窗口mysqlselectobjecttype,objectschema,objectname,locktype,lockdurationfromperformanceschema。objecttypeobjectschemaobjectnamelocktypelockdurationTABLEMySQLAdvancedtbuserSHAREDREADTRANSACTIONGLOBALNULLNULLINTENTIONEXCLUSIVESTATEMENTBACKUPLOCKNULLNULLINTENTIONEXCLUSIVETRANSACTIONSCHEMAMySQLAdvancedNULLINTENTIONEXCLUSIVETRANSACTIONTABLEMySQLAdvancedtbuserSHAREDUPGRADABLETRANSACTIONTABLESPACENULLMySQLAdvancedtbuserINTENTIONEXCLUSIVETRANSACTIONTRIGGERMySQLAdvancedtbuserinserttriggerEXCLUSIVETRANSACTIONTRIGGERMySQLAdvancedtbuserupdatetriggerEXCLUSIVETRANSACTIONTRIGGERMySQLAdvancedtbuserdeletetriggerEXCLUSIVETRANSACTIONTABLEMySQLAdvancedsql261d18EXCLUSIVESTATEMENTTABLEMySQLAdvancedtbuserEXCLUSIVETRANSACTIONTABLEperformanceschemametadatalocksSHAREDREADTRANSACTION12rowsinset(0。00sec)
  意向锁
  介绍
  为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。
  假如没有意向锁,客户端一对表加了行锁后,客户端二如何给表加表锁呢,来通过示意图简单分析一下:
  首先客户端一,开启一个事务,然后执行DML操作,在执行DML语句时,会对涉及到的行加行锁。
  当客户端二,想对这张表加表锁时,会检查当前表是否有对应的行锁,如果没有,则添加表锁,此时就会从第一行数据,检查到最后一行数据,效率较低。
  有了意向锁之后:
  客户端一,在执行DML操作时,会对涉及的行加行锁,同时也会对该表加上意向锁。
  而其他客户端,在对这张表加表锁的时候,会根据该表上所加的意向锁来判定是否可以成功加表锁,而不用逐行判断行锁情况了。
  分类意向共享锁(IS):由语句selectlockinsharemode添加。与表锁共享锁(read)兼容,与表锁排他锁(write)互斥。意向排他锁(IX):由insert、update、delete、selectforupdate添加。与表锁共享锁(read)及排他锁(write)都互斥,意向锁之间不会互斥。
  一旦事务提交了,意向共享锁、意向排他锁,都会自动释放。
  可以通过以下SQL,查看意向锁及行锁的加锁情况:selectobjectschema,objectname,indexname,locktype,lockmode,lockdatafromperformanceschema。
  演示:
  A。意向共享锁与表读锁是兼容的
  B。意向排他锁与表读锁、写锁都是互斥的
  行级锁介绍
  行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。
  InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。对于行级锁,主要分为以下三类:行锁(RecordLock):锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。
  间隙锁(GapLock):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。
  临键锁(NextKeyLock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。
  行锁
  介绍
  InnoDB实现了以下两种类型的行锁:共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。
  两种行锁的兼容情况如下:
  常见的SQL语句,在执行时,所加的行锁如下:
  SQL
  行锁类型
  说明
  INSERT
  排他锁
  自动加锁
  UPDATE
  排他锁
  自动加锁
  DELETE
  排他锁
  自动加锁
  SELECT(正常)
  不加任何锁
  SELECTLOCKINSHAREMODE
  共享锁
  需要手动在SELECT之后加LOCKINSHAREMODE
  SELECTFORUPDATE
  排他锁
  需要手动在SELECT之后加FORUPDATE
  演示
  默认情况下,InnoDB在REPEATABLEREAD事务隔离级别运行,InnoDB使用nextkey锁进行搜索和索引扫描,以防止幻读。针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁。
  可以通过以下SQL,查看意向锁及行锁的加锁情况:selectobjectschema,objectname,indexname,locktype,lockmode,lockdatafromperformanceschema。
  示例演示
  数据准备:CREATETABLEstu(idintNOTNULLPRIMARYKEYAUTOINCREMENT,namevarchar(255)DEFAULTNULL,ageintNOTNULL)ENGINEInnoDBCHARACTERSETutf8mb4;INSERTINTOstuVALUES(1,tom,1);INSERTINTOstuVALUES(3,cat,3);INSERTINTOstuVALUES(8,rose,8);INSERTINTOstuVALUES(11,jetty,11);INSERTINTOstuVALUES(19,lily,19);INSERTINTOstuVALUES(25,luci,25);
  演示行锁的时候,我们就通过上面这张表来演示一下。
  A。普通的select语句,执行时,不会加锁。
  B。selectlockinsharemode,加共享锁,共享锁与共享锁之间兼容。
  共享锁与排他锁之间互斥。
  客户端一获取的是id为1这行的共享锁,客户端二是可以获取id为3这行的排它锁的,因为不是同一行数据。而如果客户端二想获取id为1这行的排他锁,会处于阻塞状态,以为共享锁与排他锁之间互斥。
  C。排它锁与排他锁之间互斥
  当客户端一,执行update语句,会为id为1的记录加排他锁;客户端二,如果也执行update语句更新id为1的数据,也要为id为1的数据加排他锁,但是客户端二会处于阻塞状态,因为排他锁之间是互斥的。直到客户端一,把事务提交了,才会把这一行的行锁释放,此时客户端二,解除阻塞。
  D。无索引行锁升级为表锁
  stu表中数据如下:idagename11Java33Java88rose1111jetty1919lily2525luci6rowsinset(0。00sec)
  在两个客户端中执行如下操作:
  在客户端一中,开启事务,并执行update语句,更新name为Lily的数据,也就是id为19的记录。然后在客户端二中更新id为3的记录,却不能直接执行,会处于阻塞状态,为什么呢?
  原因就是因为此时,客户端一,根据name字段进行更新时,name字段是没有索引的,如果没有索引,此时行锁会升级为表锁(因为行锁是对索引项加的锁,而name没有索引)。
  接下来,我们再针对name字段建立索引,索引建立之后,再次做一个测试:
  此时我们可以看到,客户端一,开启事务,然后依然是根据name进行更新。而客户端二,在更新id为3的数据时,更新成功,并未进入阻塞状态。这样就说明,我们根据索引字段进行更新操作,就可以避免行锁升级为表锁的情况。间隙锁临键锁
  默认情况下,InnoDB在REPEATABLEREAD事务隔离级别运行,InnoDB使用nextkey锁进行搜索和索引扫描,以防止幻读。索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁。索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,nextkeylock退化为间隙锁。索引上的范围查询(唯一索引)会访问到不满足条件的第一个值为止。
  注意:
  间隙锁唯一目的是防止其他事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用间隙锁。
  示例演示
  A。索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁。
  B。索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,nextkeylock退化为间隙锁。
  介绍分析一下:
  我们知道InnoDB的B树索引,叶子节点是有序的双向链表。假如,我们要根据这个二级索引查询值为18的数据,并加上共享锁,我们是只锁定18这一行就可以了吗?并不是,因为是非唯一索引,这个结构中可能有多个18的存在,所以,在加锁时会继续往后找,找到一个不满足条件的值(当前案例中也就是29)。此时会对18加临键锁,并对29之前的间隙加锁。
  C。索引上的范围查询(唯一索引)会访问到不满足条件的第一个值为止。
  查询的条件为id19,并添加共享锁。此时我们可以根据数据库表中现有的数据,将数据分为三个部分:
  〔19〕
  (19,25〕
  (25,〕
  所以数据库数据在加锁是,就是将19加了行锁,25的临键锁(包含25及25之前的间隙),正无穷的临键锁(正无穷及之前的间隙)。
投诉 评论 转载

争分夺秒!产妇突发产后大出血,医生抢救数小时近日,山东省妇幼保健院产房,一名既往白血病合并血小板减少的准妈妈分娩后突发产后大出血,产科医护人员立即开展抢救。据悉,产妇在医生和助产士的守护下,进行无痛分娩,经过几个小……CXO龙头业绩劲升,新技术新能力突破持续打开成长空间药明康德(603259。SH)3月21日披露了2022年年报,全年营收达393。55亿元,同比增长71。8,无论是营收规模还是增速均创下历史新高。同时,归母净利润增速亦首次超过……邯郸这家泰式海鲜火锅,人均两位数,海鲜烧烤甜品不限量随便吃!浓白的椰香锅底看上去平淡无奇,但鼻尖凑近却能闻到一股馥郁鲜香。味足浓香,引人食欲大开。椰香锅底,鲜甜可口,爱喝汤的朋友们可以选它。10多种小料,正宗泰式风味,丰富好……侠盗猎车罪恶都市中常用秘籍大全(建议保存)下面是《侠盗猎车:罪恶都市》中的一些常用秘籍,希望能够帮到你:汽车类秘籍(1)PANZER出现坦克;(2)TRAVELINSTYLE出现直升机;(3)G……股市第一牛人,从5万到200亿资金裂变,游资龙头章建平如何发章建平初入股市的时候,只有5万元的资金,是名副其实的股市散户。证券市场千变万化,风起云涌。5万元在证券市场只是九牛一毛,但是章建平就凭着5万元钱资本成为股市中的一个奇迹,成功积……如何搞定MySQL(全局锁表级锁行级锁)这篇文章告诉你答案!概述锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、IO)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发……隔周三休?你是来哔哔的吧最近不是马上要开两会了嘛,有人大代表拟提交提案,建议调整双休日,改成隔周三休。也就是本周休一天,下周休三天,可以理解为调休。美曰其名,说是保证了每周都有休息同时,隔周还多……变防守强队!湖人大换血4胜1负季中交易立竿见影交易截止日过后的湖人大变脸,他们取得4胜1负的佳绩,冲击季后赛席位形势变得豁然开朗。湖人不仅仅要杀进附加赛区,如果保持现在的势头,甚至有机会冲进西部前六的位置。交易截止日,湖人……2分钟带你快速了解爆火的比特币到底是什么!比特币是一种数字货币,也被称为加密货币,它是通过使用密码学技术来保证交易安全、控制货币供应和验证交易的一种去中心化的货币系统。以下是关于比特币的详细介绍:1。比特币的历史……一位中年妇女的述说男人有小老婆,我将拥有另一挚爱寄语:杨绛说:生活是自己的,千万别为难自己,有什么样的能力,就过什么样的生活,尽力而为,量力而行。做个温暖的人,有自己的喜好,有自己的原则,有自己的信仰……边关的星海,美到窒息这样的星空你见过吗每一张都美到窒息看,纯净的星空群星闪烁感受星空万里体验夜空里的静谧与美好凝望灿烂星河思绪蔓延到天际星光映衬下……CBA最爱犯规的8名球员,郭艾伦曾给一人打替补,3人动辄6犯CBA常规赛就快要结束了,除了球队排名之外,球迷最关心的莫过于球员的个人数据,其中得分榜、助攻榜等数据倍受关注,除了这些正面数据之外,犯规、违体这些负面数据也值得关注,犯规是比……
实不相瞒,中药真的能治癌,但要解决3个问题(下篇)马斯克身家蒸发3千多亿,马云蒸发1千多亿,李嘉诚仅蒸发1百亿英超综合阿森纳赢德比战利物浦主场不胜央视国庆晚会创十年之最,6个没有好评如潮,开盲盒快乐加倍iPhoneSE3几乎没有秘密,外观硬件价格发布时间均被确认144HzE4,最强电竞手机官宣原神最高画质稳定60帧英雄联盟手游千分王者段位上分不择手段,还嘲讽钻石段位杜锋所有球队都是在同样条件下打球因此没必要强调球馆温度崩坏三大鸭鸭脚打140难度指南CBA三消息辽宁迎来期中考试,易建联第8次双20,陶汉林值得文明旅游元旦出行向不文明游园说不经常喝水和经常喝茶,到底哪个更养生?看完别再搞错了掌控十大“富人思维”,早日打入精英圈丨功。。。我爱课外阅读四个太阳有趣的作文“导购网站”有什么存在的意义?绽妍蓝膜敷多久绽妍蓝膜贴着舒服吗2018:儿童不宜版本的阿拉丁神灯为什么说楔齿蜥不是蜥蜴科技助力,竞技更强透过奥运看中国系列评论之三探访云南特有少数民族之布朗族优雅型短发发型尽显气质潮流气息怎么染发能让发色更持久能维持多长时间八仙过海

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找