MySQL锁

MySQL锁分类

  • 全局锁
  • 表级锁
  • 行锁
  • 间隙锁
  • next-key lock

全局锁

  • 作用范围:对整个数据库实例加锁。(FTWRL)flush tables with read lock;,该命令会让整个库处于只读状态,之后其他线程的以下语句会被阻塞:
      1、数据更新语句(即对数据的增删改操作)。
      2、数据定义语句(建表,修改表结构,加索引等操作)
      3、更新类事务的提交语句
  • 使用场景:全库逻辑备份。
  • 备份加锁的必要性
      如果不加锁,备份得到的库整体不是一个逻辑时间点,视图是逻辑不一致的。
  • 缺点
      1、如果在主库上备份,整个备份期间都不能执行更新,业务基本上停摆
      2、如果在从库上备份,备份期间都不能执行从主库同步过来的binlog,会导致主从延迟
  • mysqldump优点
      官方自带的逻辑备份工具mysqldump,当使用参数-single-transaction时,导数据之前会启动一个事务,确保拿到一致性视图。由于MVCC的支持,在这个备份过程中数据是可以正常更新的。
  • FTWRL的必要性
      mysqldump固然好,但是前提要引擎支持可重复读隔离级别,-single-transaction方法只是用于所有的表使用事务引擎的库。
  • FTWRL做备份优于set global readonly=true
      1、某些系统中readonly值可能被用来做其他逻辑,比如判断一个库是master还是slave,修改global变量影响大。
      2、在异常处理机制上。执行FTWRL后若是由于客户端发生异常,断开连接,MySQL会自动释放这个全局锁;set global readonly=true方式遇到这种情况会一直保持readonly状态,会导致整个库长时间不可写,风险高。

表级锁

  • 表级锁包括表锁元数据锁
  • 表锁
      lock tables t1 read, t2 write;,此时,其他线程写t1,读写t2的语句都被阻塞。同时,在执行unlock tables前,本线程也只能对t1执行读操作,对t2执行读写操作;写t1的操作时不允许的,本线程也不能访问其他表。
  • 使用场景:表锁通常用来处理并发。对于InnoDB这种支持行锁的引擎,一般不用表锁来控制并发。
  • 元数据锁MDL(Meta Data Lock)
      MDL不需要显示调用,在访问一个表时会自动加上,作用是保证读写的正确性。当对一个表做CRUD操作时,加MDL读锁;当对一个表结构变更操作时,加MDL写锁。
      读锁之间不互斥,因此可以多个线程同时对一张表做CRUD操作;写锁之间,读写锁之间互斥,用来保证变更表结构操作的安全性,如果有2个线程同时对一个表做结构变更操作,其中一个要等另一个执行完才能执行。
      MDL是系统默认加的,在一个事务中使用时,在语句执行开始时申请,但语句结束后并不会马上释放,要等整个事务提交后才释放。所以可能出现给一个小表加字段,导致整个库挂了的情况,如下:
start transaction;  -- sessionA
select * from t limit 1;  -- get MDL read and no release
start transaction;  -- sessionB
alter table t add f int;  -- waiting for session MDL read, blocked

行锁

  • InnoDB行锁是通过给索引上的索引项加锁来实现的,意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。
  • 行锁由MySQL各个引擎自己实现,并不是所有引擎都支持行锁,MyISAM就不支持行锁,InnoDB支持行锁,这里主要说InnoDB。
  • 行锁分为读锁(S锁,共享锁)写锁(X锁,排他锁)对同一行的操作,只有读锁与读锁间不冲突
  • 两阶段锁协议:在InnoDB中,行锁是在需要的时候加上,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。
  • 两阶段锁协议的影响如果一个事务中需要锁多个行,要把最可能造成锁冲突,最可能影响并发度的锁尽量往后放。同理于MDL锁的释放,也就是说一个事务中的某一行的锁的持续时间,根据两阶段锁协议,如果事务提交的时间点确定,那么越早获得这一行的行锁,它的持续时间越长,所以对并发度影响大的行要尽量往后放。
  • 死锁:两个事务互相等待对方的锁释放。
  • 死锁应对策略
      1、就是等,直到超时;超时时间可通过innodb_lock_wait_timeout设置,默认50s。(时间设置太长,很多在线服务无法接受;时间设置太短,可能产生很多非死锁的误伤)
      2、主动发起死锁检测,发现死锁后,主动回滚死锁链条中的某一事务,让其他事务得以继续执行;参数innodb_deadlock_detect=on表示开启死锁检测。
  • 主动检测死锁的过程
      每当一个事务要加行锁的时候,就要看看它所依赖的线程有没有被别人锁住(即需要看看自己需要的锁有没有在别人手里),如此循环,最后判断是否出现了循环等待,也就是死锁。

间隙锁

  • 锁住索引树上相邻两个值之间的空隙。
  • 间隙锁使用场景是RR(可重复读隔离级别),也就是说它是InnoDB引擎所特有。

next-key lock

  • 间隙锁和行锁合称next-key lock。以下是加锁规则。
  • 原则1:加锁的基本单位是next-key lock,它是( , ]左开右闭区间。(除了“唯一索引的等值查询”,其他“范围查询”、“唯一索引范围查询”、“非唯一索引的等值查询”均要找到不满足条件的“整个区间”)。
  • 原则2:查找过程中访问到的对象才会加锁。(若是涉及覆盖索引的查询,针对lock in share mode,若是所查询的字段都包含在覆盖索引中,那么不会锁主键索引;而for update 和 select 查找索引中没覆盖到的字段都会锁主键索引)。
  • 优化1唯一索引的等值查询,当找到符合条件的索引后,索引所在的间隙锁解除,该next-key lock退化为行锁
  • 优化2:索引上的等值查询(无论是否是唯一索引),当向右遍历时且最后一个值不满足等值条件的时候,next-key lock退化为间隙锁。
  • 补充1:唯一索引上的范围查询会访问到不满足条件的第一个值为止。
  • 补充2:使用limit可以减小加锁范围,取到满足条件的语句条数,就结束。delete操作建议加上limit,一是保证安全性,二是减小加锁范围。
  • 补充3:next-key lock加锁分为2步,先加间隙锁,再加行锁,间隙锁间不冲突(跟间隙锁存在冲突关系的,是“往这个间隙中插入一个记录”这个操作操作。),行锁间冲突。这种锁的顺序可能产生死锁,A拿着B需要的行锁,B拿着A插入操作需要的间隙锁)。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • 当一个系统访问量上来的时候,不只是数据库性能瓶颈问题了,数据库数据安全也会浮现,这时候合理使用数据库锁机制就显得异...
    初来的雨天阅读 3,553评论 0 22
  • 一、概述 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种...
    忘忧谷主阅读 589评论 0 3
  • 概述 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则...
    datazhen阅读 754评论 0 2
  • 一、概述 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种...
    不变甄心阅读 2,732评论 0 3
  • 今天是什么日子 起床:7 就寝:11.30 天气:晴空万里 心情:疲惫,期待 任务清单 昨日完成的任务,最重要的三...
    郑学有阅读 148评论 0 0