精华内容
下载资源
问答
  • MySQL间隙锁

    千次阅读 2020-02-24 16:08:02
    MySQL间隙锁 你需要知道的 之前我们介绍了排他锁,其实innodb下的记录锁(也叫行锁),间隙锁,next-key锁统统属于排他锁。 行锁 记录锁其实很好理解,对表中的记录加锁,叫做记录锁,简称行锁。 生活中的间隙锁 ...

    转载自crazyYong的博客

    MySQL间隙锁

    你需要知道的

    之前我们介绍了排他锁,其实innodb下的记录锁(也叫行锁),间隙锁,next-key锁统统属于排他锁。


    行锁

    记录锁其实很好理解,对表中的记录加锁,叫做记录锁,简称行锁。


    生活中的间隙锁

    编程的思想源于生活,生活中的例子能帮助我们更好的理解一些编程中的思想。
    生活中排队的场景,小明,小红,小花三个人依次站成一排,此时,如何让新来的小刚不能站在小红旁边,这时候只要将小红和她前面的小明之间的空隙封锁,将小红和她后面的小花之间的空隙封锁,那么小刚就不能站到小红的旁边。
    这里的小红,小明,小花,小刚就是数据库的一条条记录。
    他们之间的空隙也就是间隙,而封锁他们之间距离的锁,叫做间隙锁。


    Mysql中的间隙锁

    下表中(见图一),id为主键,number字段上有非唯一索引的二级索引,有什么方式可以让该表不能再插入number=5的记录?
    在这里插入图片描述

    根据上面生活中的例子,我们自然而然可以想到,只要控制几个点,number=5之前不能插入记录,number=5现有的记录之间不能再插入新的记录,number=5之后不能插入新的记录,那么新的number=5的记录将不能被插入进来。

    那么,mysql是如何控制number=5之前,之中,之后不能有新的记录插入呢(防止幻读)?
    答案是用间隙锁,在RR级别下,mysql通过间隙锁可以实现锁定number=5之前的间隙,number=5记录之间的间隙,number=5之后的间隙,从而使的新的记录无法被插入进来。


    间隙是怎么划分的?

    注:为了方面理解,我们规定(id=A,number=B)代表一条字段id=A,字段number=B的记录,(C,D)代表一个区间,代表C-D这个区间范围。

    图一中,根据number列,我们可以分为几个区间:(无穷小,2),(2,4),(4,5),(5,5),(5,11),(11,无穷大)。
    只要这些区间对应的两个临界记录中间可以插入记录,就认为区间对应的记录之间有间隙。
    例如:区间(2,4)分别对应的临界记录是(id=1,number=2),(id=3,number=4),这两条记录中间可以插入(id=2,number=3)等记录,那么就认为(id=1,number=2)与(id=3,number=4)之间存在间隙。

    很多人会问,那记录(id=6,number=5)与(id=8,number=5)之间有间隙吗?
    答案是有的,(id=6,number=5)与(id=8,number=5)之间可以插入记录(id=7,number=5),因此(id=6,number=5)与(id=8,number=5)之间有间隙的,


    间隙锁锁定的区域

    根据检索条件向左寻找最靠近检索条件的记录值A,作为左区间,向右寻找最靠近检索条件的记录值B作为右区间,即锁定的间隙为(A,B)。
    图一中,where number=5的话,那么间隙锁的区间范围为(4,11);

    间隙锁的目的是为了防止幻读,其主要通过两个方面实现这个目的:
    (1)防止间隙内有新数据被插入
    (2)防止已存在的数据,更新成间隙内的数据(例如防止numer=3的记录通过update变成number=5)


    innodb自动使用间隙锁的条件:

    (1)必须在RR级别下
    (2)检索条件必须有索引(没有索引的话,mysql会全表扫描,那样会锁定整张表所有的记录,包括不存在的记录,此时其他事务不能修改不能删除不能添加)

    示例

    在这里插入图片描述

    案例一:

    session 1:
    start  transaction ;
    select  * from news where number=4 for update ;
    
    session 2:
    start  transaction ;
    insert into news value(2,4);#(阻塞)
    insert into news value(2,2);#(阻塞)
    insert into news value(4,4);#(阻塞)
    insert into news value(4,5);#(阻塞)
    insert into news value(7,5);#(执行成功)
    insert into news value(9,5);#(执行成功)
    insert into news value(11,5);#(执行成功)
    

    检索条件number=4,向左取得最靠近的值2作为左区间,向右取得最靠近的5作为右区间,因此,session 1的间隙锁的范围(2,4),(4,5),如下图所示:
    在这里插入图片描述

    间隙锁锁定的区间为(2,4),(4,5),即记录(id=1,number=2)和记录(id=3,number=4)之间间隙会被锁定,记录(id=3,number=4)和记录(id=6,number=5)之间间隙被锁定。

    因此记录(id=2,number=4),(id=2,number=2),(id=4,number=4),(id=4,number=5)正好处在(id=3,number=4)和(id=6,number=5)之间,所以插入不了,需要等待锁的释放,而记录(id=7,number=5),(id=9,number=5),(id=11,number=5)不在上述锁定的范围内,因此都会插入成功。


    案例二:

    session 1:
    start  transaction ;
    select  * from news where number=13 for update ;
    
    session 2:
    start  transaction ;
    insert into news value(11,5);#(执行成功)
    insert into news value(12,11);#(执行成功)
    insert into news value(14,11);#(阻塞)
    insert into news value(15,12);#(阻塞)
    update news set id=14 where number=11;#(阻塞)
    update news set id=11 where number=11;#(执行成功)
    

    检索条件number=13,向左取得最靠近的值11作为左区间,向右由于没有记录因此取得无穷大作为右区间,因此,session 1的间隙锁的范围(11,无穷大),如下图所示:

    在这里插入图片描述
    此表中没有number=13的记录的,innodb依然会为该记录左右两侧加间隙锁,间隙锁的范围(11,无穷大)。

    有人会问,为啥update news set id=14 where number=11会阻塞,但是update news set id=11 where number=11却执行成功呢?

    间隙锁采用在指定记录的前面和后面以及中间的间隙上加间隙锁的方式避免数据被插入,此图间隙锁锁定的区域是(11,无穷大),也就是记录(id=13,number=11)之后不能再插入记录,update news set id=14 where number=11这条语句如果执行的话,将会被插入到(id=13,number=11)的后面,也就是在区间(11,无穷大)之间,由于该区间被间隙锁锁定,所以只能阻塞等待,而update news set id=11 where number=11执行后是会被插入到(id=13,number=11)的记录前面,也就不在(11,无穷大)的范围内,所以无需等待,执行成功。


    案例三:

    session 1:
    start  transaction ;
    select  * from news where number=5 for update;
    
    session 2:
    start  transaction ;
    insert into news value(4,4);#(阻塞)
    insert into news value(4,5);#(阻塞)
    insert into news value(5,5);#(阻塞)
    insert into news value(7,11);#(阻塞)
    insert into news value(9,12);#(执行成功)
    insert into news value(12,11);#(阻塞)
    update news set number=5 where id=1;#(阻塞)
    update news set id=11 where number=11;#(阻塞)
    update news set id=2 where number=4 ;#(执行成功)
    update news set id=4 where number=4 ;#(阻塞)
    

    检索条件number=5,向左取得最靠近的值4作为左区间,向右取得11为右区间,因此,session 1的间隙锁的范围(4,5),(5,11),如下图所示:
    在这里插入图片描述

    有人会问,为啥insert into news value(9,12)会执行成功?间隙锁采用在指定记录的前面和后面以及中间的间隙上加间隙锁的方式避免数据被插入,(id=9,number=12)很明显在记录(13,11)的后面,因此不再锁定的间隙范围内。

    为啥update news set number=5 where id=1会阻塞?
    number=5的记录的前面,后面包括中间都被封锁了,你这个update news set number=5 where id=1根本没法执行,因为innodb已经把你可以存放的位置都锁定了,因为只能等待。

    同理,update news set id=11 where number=11由于记录(id=10,number=5)与记录(id=13,number=11)中间的间隙被封锁了,你这句sql也没法执行,必须等待,因为存放的位置被封锁了。


    案例四:

    session 1:
    start  transaction;
    select * from news where number>4 for update;
    
    session 2:
    start  transaction;
    update news set id=2 where number=4 ;#(执行成功)
    update news set id=4 where number=4 ;#(阻塞)
    update news set id=5 where number=5 ;#(阻塞)
    insert into news value(2,3);#(执行成功)
    insert into news value(null,13);#(阻塞)
    

    检索条件number>4,向左取得最靠近的值4作为左区间,向右取无穷大,因此,session 1的间隙锁的范围(4,无穷大),如下图所示:

    session2中之所以有些阻塞,有些执行成功,其实就是因为插入的区域被锁定,从而阻塞。


    next-key锁

    next-key锁其实包含了记录锁和间隙锁,即锁定一个范围,并且锁定记录本身,InnoDB默认加锁方式是next-key 锁。
    上面的案例一session 1中的sql是:select * from news where number=4 for update ;
    next-key锁锁定的范围为间隙锁+记录锁,即区间(2,4),(4,5)加间隙锁,同时number=4的记录加记录锁。

    展开全文
  • mysql间隙锁

    2018-08-14 21:15:02
    前面一文 mysql锁 介绍了mysql innodb存储引擎的各种锁,本文介绍一下innodb存储引擎的间隙锁,就以下问题展开讨论 1.什么是间隙锁间隙锁是怎样产生的? 2.间隙锁有什么作用? 3.使用间隙锁有什么隐患? 一、...

    前面一文 mysql锁 介绍了mysql innodb存储引擎的各种锁,本文介绍一下innodb存储引擎的间隙锁,就以下问题展开讨论

    1.什么是间隙锁?间隙锁是怎样产生的?

    2.间隙锁有什么作用?

    3.使用间隙锁有什么隐患?

    一、间隙锁的基本概念

    1.什么叫间隙锁

    当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(NEXT-KEY)锁。

    2.间隙锁的产生

    上面的文字很抽象,现在举个栗子,介绍间隙锁是怎么产生的:

    假设有以下表t_student:(其中id为PK,name为非唯一索引)

    id name sex address
    1 zhaoyi 0 beijin
    3 sunsan 1 shanghai
    4 lisi 0 guangzhou
    5 zhouwu 0 shenzhen
    6 wuliu 1 hangzhou

    这个时候我们发出一条这样的加锁sql语句:

    select id,name from t_student where id > 0 and id < 5 for update;

    这时候,我们命中的数据为以下着色部分:

    id name sex address
    1 zhaoyi 0 beijin
    3 sunsan 1 shanghai
    4 lisi 0 guangzhou
    5 zhouwu 0 shenzhen
    6 wuliu 1 hangzhou

    细心的朋友可能就会发现,这里缺少了条id为2的记录,我们的重点就在这里。

    select ... for update这条语句,是会对数据记录加锁的,这里因为命中了索引,加的是行锁。从数据记录来看,这里排它锁锁住数据是id为1、3和4的这3条数据。

    但是,看看前面我们的介绍——对于键值在条件范围内但不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁。

    好了,我们这里,键值在条件范围但是不存在的记录,就是id为2的记录,这里会对id为2数据加上间隙锁。假设这时候如果有id=2的记录insert进来了,是要等到这个事务结束以后才会执行的

    二、间隙锁的作用

    总的来说,有2个作用:防止幻读和防止数据误删/改

    1.防止幻读

    关于幻读的概念可以参考我这篇文章 https://blog.csdn.net/mweibiao/article/details/80805031 ,这里就不多做解释了

    假设有下面场景

    时间 事务A 事务B
    T1 select count(1) from t_student where id > 1;  
    T2   insert into t_student values(2,'qianer',1,'nanjing');
    T3   commit;
    T4 select count(1) from t_student where id > 1;  
    T5 commit;  

    如果没有间隙锁,事务A在T1和T4读到的结果是不一样的,有了间隙锁,读的就是一样的了

    2.防止数据误删/改

    这个作用比较重要,假设以下场景:

    时间 事务A 事务B
    T1 delete from t_student where id < 4;  
    T2   insert into t_student values(2,'qianer',1,'nanjing');
    T3   commit;
    T4 commit;  

    这种情况下,如果没有间隙锁,会出现的问题是:id为2的记录,刚加进去,就被删除了,这种情况有时候对业务,是致命性的打击。加了间隙锁之后,由于insert语句要等待事务A执行完之后释放锁,避免了这种情况

    三.使用间隙锁的隐患

    最大的隐患就是性能问题

    前面提到,假设这时候如果有id=2的记录insert进来了,是要等到这个事务结束以后才会执行的,假设是这种场景  

    时间 事务A 事务B
    T1 select * from t_student where id>1 and id < 100 for update;  
    T2   insert into t_student values(2,'qianer',1,'nanjing');
    T3 update t_student set xxxx where id=xxx;  
    T4 update t_student set xxxx where id=xxx;  
    T5 update t_student set xxxx where id=xxx;  
    T6  
    T7 commit;  

    这种情况,对插入的性能就有很大影响了,必须等到事务结束才能进行插入,性能大打折扣

    更有甚者,如果间隙锁出现死锁的情况下,会更隐晦,更难定位

     

     

     

     

     

     

     

     

     

    展开全文
  • mysql 间隙锁

    2018-09-08 15:49:00
    Mysql innodb 间隙锁 (转) MySQL InnoDB支持三种行锁定方式: l行锁(Record Lock):锁直接加在索引记录上面,锁住的是key。 l间隙锁(Gap Lock):锁定索引记录间隙,确保索引记录的间隙不变。间隙锁是针对事务...

     

    InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析(最后部分精彩)

    Mysql innodb 间隙锁 (转)

    MySQL InnoDB支持三种行锁定方式:

    l   行锁(Record Lock):锁直接加在索引记录上面,锁住的是key。

    l   间隙锁(Gap Lock):锁定索引记录间隙,确保索引记录的间隙不变。间隙锁是针对事务隔离级别为可重复读或以上级别而已的。

    l   Next-Key Lock :行锁和间隙锁组合起来就叫Next-Key Lock。

     

    默认情况下,InnoDB工作在可重复读隔离级别下,并且会以Next-Key Lock的方式对数据行进行加锁,这样可以有效防止幻读的发生。Next-Key Lock是行锁和间隙锁的组合,当InnoDB扫描索引记录的时候,会首先对索引记录加上行锁(Record Lock),再对索引记录两边的间隙加上间隙锁(Gap Lock)。加上间隙锁之后,其他事务就不能在这个间隙修改或者插入记录。

     

    Gap Lock在InnoDB的唯一作用就是防止其他事务的插入操作,以此防止幻读的发生。

     

    1、     行锁(Record Lock)

    行锁锁定的是索引记录,而不是行数据,也就是说锁定的是key。

    2、     间隙锁(Gap Lock)

    例如:

    create table test(id int,v1 int,v2 int,primary key(id),key `idx_v1`(`v1`))Engine=InnoDB DEFAULT CHARSET=UTF8;

    该表的记录如下:

    +----+------+------+

    | id | v1   | v2   |

    +----+------+------+

    |  1 |    1 |    0 |

    |  2 |    3 |    1 |

    |  3 |    4 |    2 |

    |  5 |    5 |    3 |

    |  7 |    7 |    4 |

    | 10 |    9 |    5 |

     

    间隙锁(Gap Lock)一般是针对非唯一索引而言的,test表中的v1(非唯一索引)字段值可以划分的区间为:

    (-∞,1)

    (1,3)

    (3,4)

    (4,5)

    (5,7)

    (7,9)

    (9, +∞)

    假如要更新v1=7的数据行,那么此时会在索引idx_v1对应的值,也就是v1的值上加间隙锁,锁定的区间是(5,7)和(7,9)。同时找到v1=7的数据行的主键索引和非唯一索引,对key加上锁。

    3、     后码锁(Next-Key Lock)

    记录锁和间隙锁的结合,对于InnoDB中,更新非唯一索引对应的记录(在这里来说是更新v1字段的值),会加上Next-Key Lock。如果更新记录为空,就不能加记录锁,只能加间隙锁。

     

    举个例子(事务隔离级别为MySQL默认的可重复读)

    MySQL <wbr>InnoDB锁机制之Gap <wbr>Lock、Next-Key <wbr>Lock、Record <wbr>Lock解析

    为什么TRANSACTION 2的insert操作会被阻塞,产生等待呢?这是因为TRANSACTION 2插入的v1值为6在TRANSACTION 1的锁定区间(5,9)内。而TRANSACTION 1插入的v1值不在TRANSACTION 2的锁定区间(5,7)内,故可以成功插入。不仅仅insert操作, update操作也一样会被锁住,从而锁等待超时。

     

    事务是否自动提交: select @@autocommit;
    取消本会话内事务自动提交: set @@session.autocommit=0;

     

    4、     锁选择

    1)、如果更新条件没有走索引,例如执行”update from t1 set v2=0 where v2=5;” ,此时会进行全表扫描,扫表的时候,要阻止其他任何的更新操作,所以上升为表锁。

    2)、如果更新条件为索引字段,但是并非唯一索引(包括主键索引),例如执行“update from t1 set v2=0 where v1=9;” 那么此时更新会使用Next-Key Lock。使用Next-Key Lock的原因:

    a)、首先要保证在符合条件的记录上加上排他锁,会锁定当前非唯一索引和对应的主键索引的值;

    b)、还要保证锁定的区间不能插入新的数据。

    3)、如果更新条件为唯一索引,则使用Record Lock(记录锁)。

     

    InnoDB根据唯一索引,找到相应记录,将主键索引值和唯一索引值加上记录锁。但不使用Gap Lock(间隙锁)。

    5、     间隙锁(Gap Lock)

     

    加后码锁的时候,并没有锁住间隙两端的记录(这里的两端分别是5,9和5,7),那么两端的记录是可以更新的,但是如果更新两端的记录会影响到间隙锁,那么操作会被挂起,等待间隙锁释放。

    MySQL <wbr>InnoDB锁机制之Gap <wbr>Lock、Next-Key <wbr>Lock、Record <wbr>Lock解析

     

    看以下演示:

    MySQL <wbr>InnoDB锁机制之Gap <wbr>Lock、Next-Key <wbr>Lock、Record <wbr>Lock解析

    MySQL <wbr>InnoDB锁机制之Gap <wbr>Lock、Next-Key <wbr>Lock、Record <wbr>Lock解析

    为什么在左侧值为4,右侧值为7的时候,有时候操作会被挂起,有时候操作不会挂起呢?解释如下:

    MySQL <wbr>InnoDB锁机制之Gap <wbr>Lock、Next-Key <wbr>Lock、Record <wbr>Lock解析

    当插入左侧值的时候,即插入v1=4的时候,要求插入的id值小于id=3的范围。当v1=4的记录有多条的时候,插入的id值要小于其中的最大id值。则可以成功插入;

    当插入右侧值的时候,即插入v1=7的时候,要求插入的id值要大于id=7的范围。当v1=7的记录有多条的时候,插入的id值要大于其中的最小id值。则可以成功插入。

     

    转载于:https://www.cnblogs.com/wzj4858/p/9609413.html

    展开全文
  • MySQL 间隙锁

    2018-04-19 13:01:24
    系统在高并发情况下,经常出现insert死锁,经过排查是间隙锁在作怪!MySQL InnoDB支持三种行锁方式:行锁(Record Lock):也叫记录锁,锁直接加在索引记录上。间隙锁(Gap Lock):锁加在不存在的空闲空间,可以是两...

    系统在高并发情况下,经常出现insert死锁,经过排查是间隙锁在作怪!


    MySQL InnoDB支持三种行锁方式:

    行锁(Record Lock):也叫记录锁,锁直接加在索引记录上。

    间隙锁(Gap Lock):锁加在不存在的空闲空间,可以是两个索引记录之间,也可能是第一个索引记录之前或最后一个索引记录之后的空间。

    Next-Key Lock:行锁与间隙锁组合起来用就叫做Next-Key Lock.

    默认情况,InnoDB工作在Repeatable Read 隔离级别下,对主健索引,唯一性索引以记录锁方式对数据进行加锁,对普通索引以Next-Key Lock的方式对数据行进行加锁。如果一个间隙被事务加了锁,其它事务这时不能在这个间隙插入记录的,这样可以有效防止幻读的发生。

    若要禁用间隙锁的话,可以把隔离级别降到Read Commited 或者开启参数innodb_locks_unsafe_for_binlog(默认值为OFF,即启用间隙锁,若设置为true,则不启用间隙锁),但是修改这个参数会影响主从复制及灾难恢复,所以只有修改代码逻辑才是比较好的解决办法。

    间隙锁的出现主要集中在同一个事物中先delete后insert的情况下,我们通过一个参数条件去删除一条记录的时候,如果参数条件存在,那么这时产生的是普通行锁,锁住这个记录,然后进行删除,随后释放行锁。如果这参数条件记录不存在,这时候delete语句获取到一个间隙锁,然后数据库会向左扫描到第一个比当前参数小的值,向右扫描到第一个比给定参数大的值,然后以此为界,锁住整个区域内的数据,就这样一个特别容易产生死锁的间隙锁诞生了。

    举例:

    表student

    id      grade

    1      79

    2     80

    15   90

    30   98

    开启一个客户端会话:

    sql>set autocommit=0;   (取消自动提交)

    sql>delete from student  where grade=90;

    sql>insert into student  values(20,100);

    在没有并发或是极少并发的情况下,这样会可能会正常执行,在Mysql中,实际事务都是穿行执行的,在高并发情况下,执行顺序就极有可能发生改变,变成下面样子:

    sql>delete from student  where grade=90;

    sql>delete from student  where grade=91;

    sql>insert into student  values(15,90);

    sql>insert into student  values(25,99);

    这个时候最后一条语句:insert into student values(25,99);执行时就会爆发死锁错误。因为删除grade=91这条记录的时候,90--98都被锁住,他们都取得了这个数据段的共享锁,所以在获取这个数据段的排它锁时出现死锁。


    这种问题的解决办法:前面有说降低隔离级别会影响主从复制及灾难恢复,所以建议最好修改代码逻辑,存在才删除,尽量不要去删除不存在的记录。








    展开全文
  • MYSQL 间隙锁

    2015-09-30 09:42:43
    repeatable-read是Mysql默认事务隔离级别!能解决脏读以及不可重复读的问题,但可能出现幻读的情况 不可重复读:在一个未提交的事务里,二次查询结果可能不相同,因为在这个事务执行过程中,外面的 事务可能...
  • 【锁】MySQL间隙锁

    2019-09-24 17:46:56
    【锁】MySQL间隙锁 前段时间系统老是出现insert死锁,很是纠结。经过排查发现是间隙锁!间隙锁是innodb中行锁的一种, 但是这种锁锁住的却不止一行数据,他...
  • 目录一、建表SQL二、MySql间隙锁的基本演示三、什么是间隙锁四、间隙锁危害 一、建表SQL 1、创建test_innodb_lock表的SQL CREATE TABLE test_innodb_lock ( a INT(11), b VARCHAR(16) )ENGINE=INNODB; INSERT INTO ...
  • 细说Mysql间隙锁

    2020-04-21 22:40:07
    1.什么是间隙锁间隙锁是怎样产生的? 2.间隙锁有什么作用? 3.使用间隙锁有什么隐患? 一、间隙锁的基本概念 1.什么叫间隙锁 当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合...
  • MySQL间隙锁、Next-Key Lock主要知识点
  • MySQL间隙锁一. 间隙锁的概念二. 间隙锁的产生三. 间隙锁的作用①. 防止幻读②. 防止数据误删/改三.使用间隙锁的隐患 MySQL InnoDB支持三种行锁定方式: 行锁(Record Lock):锁直接加在索引记录上面。 间隙锁...
  • MySQL间隙锁问题

    2019-10-07 23:29:28
    间隙锁(Gap Lock):锁加在不存在的空闲空间,可以是两个索引记录之间,也可能是第一个索引记录之前或最后一个索引之后的空间。  最近用户反馈说系统老是出现insert时,等待超时了,最后发现是insert间隙锁间隙...
  • 详解mysql间隙锁

    千次阅读 2019-01-17 18:51:00
    1.什么是间隙锁? (1)对于键值在条件范围内但并不存在的记录(在相等条件下请求给一个不存在的记录也会加锁),叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key锁)。 ...
  • [MySQL] 理解mysql间隙锁

    2021-05-14 06:15:03
    会把符合条件的范围 , 包括条件里面不存在的记录加上间隙锁 当其他事务往这个范围内插入记录时 , 会把阻塞 例子: 事务A set autocommit=0; //关闭自动提交 select * from message where id >10 and id...
  • mysql间隙锁小测

    2021-02-02 11:07:04
    1、间隙锁是为了防止事务更新删除或者锁定数据时,别的事务dml符合事务1条件的数据,从而造成幻读,理解间隙锁前,先了解一下快照读和当前读,并非事务开启就开启快照读,而是第一条select语句执行才产生快照,当...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,115
精华内容 446
关键字:

mysql间隙锁

mysql 订阅