MySQL锁和事务隔离级别

无论数据有没有上锁都可以使用select ...from...查询数据,因为普通查询是快照读没有任何锁机制。

事物隔离级别(mysql默认可重复读):

事物隔离级别

脏读:读到其他事物未提交的数据,可能其他事物事物失败回滚。

不可重复读:同一个事务中第一次读取和第二次读取同一行数据,期间数据被修改了,两次读取到的数据内容不同。

幻读:同一个事务中两次查找的出的结果数量不同,两次查找期间插入(删除)了新的符合条件的数据。RR级别时MVCC的事物版本号解决了读数据的幻读(快照读)。但是在修改数据时,仍然会更新比当前事物版本号高的事物插入并提交的数据(当前读)。

共享锁:

读锁又称为共享锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

加共享锁可以使用select ... lock in share mode语句。

排他锁:

写锁又称为排他锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。

加排他锁可以使用select ...for update 语句。

行锁:

行锁是排他锁的一种,它只锁住一行数据,是通过给主键加锁实现的。在用for update给查询结果加锁时,如果查询使用了二级索引,则在二级索引上找到主键索引,并把对应记录加锁。加锁的数据可能多于查询出来的数据,因为可能有些条件没有使用索引。如果查询没有使用索引,则使用表锁。

innodb有行锁,myisam则没有。

间隙锁:

间隙锁本质上是用于阻止其他事务在该间隙内(两边都是开区间)插入新记录,是不区分共享间隙锁或互斥间隙锁的,而且间隙锁是不互斥的,即两个事务可以同时持有包含共同间隙的间隙锁。这里的共同间隙包括两种场景:其一是两个间隙锁的间隙区间完全一样;其二是一个间隙锁包含的间隙区间是另一个间隙锁包含间隙区间的子集。也就是说间隙锁的应用场景包括并发读取、并发更新、并发删除和并发插入。

在RU和RC两种隔离级别下,即使你使用select ... in share mode或select ... for update,也无法防止幻读(读后写的场景)。因为这两种隔离级别下只会有行锁,而不会有间隙锁。

临键锁:

每个数据行上的非唯一索引列上都会存在一把临键锁,当某个事务持有该数据行的临键锁时,会锁住该行数据上下两个区间。如下图,当使用for update获取cnt=5的临间锁(cnt字段必须要有索引)时。无法插入1<=cnt<10的数据。cnt=10的数据可以插入,cnt=1则不行。我的innodb和MySQL版本都是5.6.42。临间锁=行锁+上下两个区间的间隙锁。

数据展示

插入意向锁:

插入意向锁,是间隙锁的一种。RR级别是有间隙锁的。即使在同一个索引,同一个区间,但插入的记录并不冲突 ,事物之间不会相互堵塞。插入意向锁和间隙锁不兼容。

意向共享/排他锁:

意向锁致力于解决表锁和行锁冲突的问题。意向锁本身时表锁。意向共享锁和排他锁之间本身不会互相冲突。

如果没有意向锁,事物A获得了表中一条记录的写锁,此时事物B想要锁住整张表,必须要遍历所有数据确保所有数据都没有被加锁,而遍历一半发现事物A锁住了一条记录,于是事物B加表锁失败。这样效率低下。

有了意向锁,事物A对表先申请意向共享/排他锁,然后对相应记录添加记录锁。此时事物B想锁住整张表,发现表上已经有意向共享/排他锁,说明表中某些数据正在被加读/写锁。此时直接加锁失败。当然,如果事物B只想修改几条数据的话,可以申请意向排他锁(即使表上已经有意向排他锁也不妨碍其他事物申请意向排他锁),然后看自己要修改的记录是否有锁,没有锁则直接加锁修改,有锁则挂起等待。

自增锁:

自增锁是一种特殊的表级锁,主要用于事务中插入自增字段(AUTO_INCREMENT),也就是我们最常用的自增主键id。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容