一条简单update语句,mysql锁操作

目录

  • 前置知识
  • 实例分析加锁情况

todo 结合参考文章0和参考文章1重新梳理下, ACID, explain分析

  • 深入篇可以总结下https://www.jianshu.com/p/945d391f9ef0
  • redo log undo log
  • orderby limit为什么有时候返回值不同,因为非稳定性算法比如快排排序,orderby的列不唯一,加个唯一列比如id就好
  • mvcc在select insert(事务2) update select不能解决幻读RR级别下,可以找下资料总结

前置知识

MVCC多版本并发控制
  • MVCC(Multi-Version Concurrency Control): 读不加锁,读写不冲突。同一份数据临时保存多个版本的一种方式,进而实现并发控制。 MVCC分两类
  1. 快照读: 读取的是记录中的可见版本(可能是历史版本, 可以简单理解为每条记录多一个version字段,每次更新都会操作这个version。),不用加锁。
  2. 当前读(特殊的select操作、insert、delete和update):读取的是记录中最新版本,并且当前读返回的记录都会加上锁,这样保证了了其他事务不会再并发修改这条记录。
聚集索引
  • 完整的记录,储存在主键索引中,通过主键索引,就可以获取记录中所有的列。非聚集索引就需要回表查数据。
隔离级别
  • Read Uncommitted:可以读取未提交记录。存在脏读,不可重复读,幻读现象。此隔离级别一般不会使用。
  • Read Committed(RC): 解决了脏读,存在不可重复读,幻读现象
  • Repeatable Read(RR): 解决了不可重复读,存在幻读现象。可重复读主要是针对其他事务的update与delete不会对本事务产生影响,而其他事务的insert操作对本事务的查询产生影响则称为幻读。
  • Serializable:从MVCC并发控制退化为基于锁的并发控制。
InnoDB中完整行锁
  • 记录锁(Record Lock):记录锁锁定索引中的一条记录
  • 间隙锁(Gap Lock):间隙锁要么锁住索引记录中间的值,要么锁住第一个索引记录前面的值或最后一个索引记录后面的值。
  • Next-Key Lock:Next-Key锁时索引记录上的记录锁和在记录之前的间隙锁的组合。

实例分析加锁情况

/**
* table T (id int, name varchar(20));执行的是delete语句,下面展示了RR避免可重复读的方式
* 如果是insert语句,则不同事务有可能出现幻读可以通过for update形式避免,for update在 
* insert形式无数据情况下会加gap锁, 实例分析参考参考文章2.InnoDB Gap锁
**/
delete from T where id = 10;
id为主键 + RC/RR
  • id是主键时,执行该语句时,只需要将主键id = 10的记录加上写锁
id唯一索引 + RC/RR
  • 由于id是唯一索引,因此delete语句会选择走id列的索引进行where条件过滤,在找到id = 10的记录后,首先会将唯一索引上的id = 10的记录加上X锁,同时,会根据读取到的name列,回到主键索引(聚簇索引),然后将聚簇索引上的name 对应的主键索引项加写锁。唯一索引只有一条记录相对应,所以查询只会返回一条记录。
id不唯一索引+RC
  • 若id列上有非唯一索引,那么对应的所有满足SQL查询条件的记录,都会加上锁。同时,这些记录在主键索引上也会加上锁。
id无索引+RC
  • 若id列上没有索引,MySQL会走聚簇索引进行全表扫描过滤。由于是在MySQl Server层面进行的。因此每条记录无论是否满足条件,都会加上X锁,但是,为了效率考虑,MySQL在这方面进行了改进,在扫描过程中,若记录不满足过滤条件,会进行解锁操作。
id不唯一索引+RR
  • 在RR隔离级别下,id列上有非唯一索引,对于上述的SQL语句;首先,通过id索引定位到第一条满足条件的记录,给记录加上X锁,并且给其Gap加上Gap锁,然后在主键聚簇索引上满足相同条件的记录加上X锁,然后返回;之后读取下一条记录重复进行。直至第一条出现不满足条件的记录,此时,不需要给记录加上X锁,但是需要给其Gap加上Gap锁吗,最后返回结果。


    加锁分析.png
id无索引+RR
  • 在Repeatable Read隔离级别下,如果进行全表扫描的当前读,那么会锁上表上的所有记录,并且所有的Gap加上Gap锁。
  • 当然在MySQL中,可以触发 semi-consistent read来缓解锁开销与并发影响,但是semi-consistent read本身也会带来其他的问题,不建议使用。

参考文章

  1. 对于MVCC以及如何在RR上解决幻读的理解
  2. 一条简单的更新语句,MySQL是如何加锁的?
  3. InnoDB Gap锁
  4. 【性能优化实战】4次版本迭代,我们将项目性能提升了360倍!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351