展开

关键词

innodb锁机制探究(三)---插入意向锁

innodb锁机制探究(三)---插入意向锁 之前的文章中,提到了插入意向锁,今天来说说这种类型的锁。 先来看官方文档中对于这个锁是怎么介绍的。 意思是插入意向锁是一种间隙锁,专门针对的是数据行的插入操作,多个事务插入相同的索引间隙时,只要不是插入到相同的位置,则不需要进行锁等待。 简单理解就是插入意向锁锁定了索引之间的间隙,但是插入意向锁之间没有互相阻塞。 这个过程中我们可以看出,会话2中插入4和3的值都没有得到响应,其本质是事务还没有获取当前范围的排它锁,那么按照上面的叙述,应该会用插入意向锁来锁定相关的范围,我们使用show engine innodb 上面的例子只是展示了插入意向锁的存在,现在我们来看插入意向锁之间,关于不同的记录,他们没有相互影响,首先看表中的记录: mysql :yeyztest 12:00:29>>select * from lock_test4

2.1K20

Innodb存储引擎之插入缓冲

Innodb存储引擎之插入缓冲 Innodb存储引擎特性之插入缓冲 01 基础知识 我们知道,innodb存储引擎是基于磁盘存储的,它同时利用缓冲池技术来提高数据库的整体性能,具体的利用方法为 ----------------------+----------------+ 10 rows in set (0.03 sec) innodb_buffer_pool是我们今天要了解的插入缓冲 02 插入类型 主键上的插入---聚集索引B+树插入Innodb存储引擎下,我们会为每一个表设置主键,主键一般设置为自增长的,这样,在我们进行数据插入的时候,如果设置主键列的值为null ,然后刷盘,而是先判断即将插入的普通索引页是否在缓冲池中,如果该普通索引页已经存在于缓冲池中,则直接进行插入操作;如果该普通索引页不存在于缓冲池中,则innodb会将这些insert操作先存放到缓冲池中 第一条容易理解,如果索引是主键索引,也就是聚集索引,那么由于自增列的存在,插入的时候往往是顺序插入的,索引不会用到插入缓存,第二条,索引不能是唯一的,这是因为如果索引唯一,那么每一次在将数据插入到数据页的时候

32510
  • 广告
    关闭

    老用户专属续费福利

    云服务器CVM、轻量应用服务器1.5折续费券等您来抽!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Innodb关键特性之插入缓冲

    Innodb关键特性之插入缓冲 Insert Buffer 什么是insert buffer? 插入缓冲,也称之为insert buffer,它是innodb存储引擎的关键特性之一,我们经常会理解插入缓冲时缓冲池的一个部分,这样的理解是片面的,insert buffer的信息一部分在内存中,另外一部分像数据页一样 在innodb中,我们知道,如果一个表有自增主键,那么对于这个表的默认插入是非常快的,注意,这里的主键是自增的,如果不是自增的,那么这个插入将会变成随机的,就可能带来数据页分裂的开销,这样,插入就不是顺序的 Innodb存储引擎针对这种情况,设计了Insert Buffer,对于非聚集索引的插入或者更新操作,不是每一次插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,如果在,则直接插入,如果不在, 当一个辅助索引要插入到数据页的时候,如果这个数据页不在缓冲池中,那么innodb会根据规则构造一个search key,接下来将这个记录插入到insert buffer的B+树里面去,插入的过程中,需要对这个记录进行一些构造

    1.1K20

    MySQL的死锁系列- 锁的类型以及加锁原理

    插入意向锁 插入意向锁是一种特殊的间隙锁(简写成 II GAP)表示插入的意向,只有在 INSERT 的时候才会有这个锁。 注意,这个锁虽然也叫意向锁,但是和上面介绍的表级意向锁是两个完全不同的概念,不要搞混了。 插入意向锁插入意向锁之间互不冲突,所以可以在同一个间隙中有多个事务同时插入不同索引的记录。 插入意向锁只会和间隙锁或 Next-key 锁冲突,正如上面所说,间隙锁唯一的作用就是防止其他事务插入记录造成幻读,正是由于在执行 INSERT 语句时需要加插入意向锁,而插入意向锁和间隙锁冲突,从而阻止了插入操作的执行 插入意向锁较为特殊,所以我们先对插入意向锁做个总结,如下: 插入意向锁不影响其他事务加其他任何锁。 也就是说,一个事务已经获取了插入意向锁,对其他事务是没有任何影响的; 插入意向锁与间隙锁和 Next-key 锁冲突。

    44800

    InnoDB中的意向锁,不与行级锁冲突的表级锁

    前言 InnoDB 支持多粒度锁(multiple granularity locking),它允许行级锁与表级锁共存,而意向锁就是其中的一种表锁。 第二个任务在锁定该表前不必检查各个页或行锁,而只需检查表上的意向锁。 设想这样一张 users 表:MySql,InnoDB,Repeatable-Read:users(id PK,name) ? 很明显这是一个效率很差的做法,但是有了意向锁之后,情况就不一样了: 意向锁的兼容互斥性 意向锁是怎么解决这个问题的呢?首先,我们需要知道意向锁之间的兼容互斥性: ? 意向锁的并发性 这就牵扯到我前面多次强调的一件事情: 意向锁不会与行级的共享 / 排他锁互斥!!!意向锁不会与行级的共享 / 排他锁互斥!!!意向锁不会与行级的共享 / 排他锁互斥!!! 总结 InnoDB 支持多粒度锁,特定场景下,行级锁可以与表级锁共存。 意向锁之间互不排斥,但除了 IS 与 S 兼容外,意向锁会与 共享锁 / 排他锁 互斥。

    89620

    MySQL的死锁系列- 锁的类型以及加锁原理

    插入意向锁 插入意向锁是一种特殊的间隙锁(简写成 II GAP)表示插入的意向,只有在 INSERT 的时候才会有这个锁。 注意,这个锁虽然也叫意向锁,但是和上面介绍的表级意向锁是两个完全不同的概念,不要搞混了。 插入意向锁插入意向锁之间互不冲突,所以可以在同一个间隙中有多个事务同时插入不同索引的记录。 插入意向锁只会和间隙锁或 Next-key 锁冲突,正如上面所说,间隙锁唯一的作用就是防止其他事务插入记录造成幻读,正是由于在执行 INSERT 语句时需要加插入意向锁,而插入意向锁和间隙锁冲突,从而阻止了插入操作的执行 插入意向锁较为特殊,所以我们先对插入意向锁做个总结,如下: 插入意向锁不影响其他事务加其他任何锁。 也就是说,一个事务已经获取了插入意向锁,对其他事务是没有任何影响的; 插入意向锁与间隙锁和 Next-key 锁冲突。

    30930

    这次终于懂了,InnoDB的七种锁(收藏)

    第三种,意向锁(Intention Locks) InnoDB支持多粒度锁(multiple granularity locking),它允许行级锁与表级锁共存,实际应用中,InnoDB使用的是意向锁。 第四种,插入意向锁(Insert Intention Locks) 对已有数据行的修改与删除,必须加强互斥锁X锁,那对于数据的插入,是否还需要加这么强的锁,来实施互斥呢?插入意向锁,孕育而生。 插入意向锁,是间隙锁(Gap Locks)的一种(所以,也是实施在索引上的),它是专门针对insert操作的。 回答:虽然事务隔离级别是RR,虽然是同一个索引,虽然是同一个区间,但插入的记录并不冲突,故这里: (1)使用的是插入意向锁; (2)并不会阻塞事务B; 【思路小结】 (1)InnoDB使用共享锁,可以提高读读并发 ; (2)为了保证数据强一致,InnoDB使用强互斥锁,保证同一行记录修改与删除的串行性; (3)InnoDB使用插入意向锁,可以提高插入并发; 【另一个案例】 假设不是插入并发,而是读写并发,又会是什么样的结果呢

    61230

    重要,知识点:InnoDB插入缓冲

    InnoDB引擎有几个重点特性,为其带来了更好的性能和可靠性: 插入缓冲(Insert Buffer) 两次写(Double Write) 自适应哈希索引(Adaptive Hash Index) 异步 IO(Async IO) 刷新邻接页(Flush Neighbor Page) 今天我们的主题就是 插入缓冲(Insert Buffer),由于InnoDB引擎底层数据存储结构式B+树,而对于索引我们又有聚集索引和非聚集索引 所以为了解决非聚集索引插入性能的问题,InnoDB引擎 创造了Insert Buffer。 Insert Buffer 的到来 可以看出非聚集索引插入的离散性导致了插入性能的下降,因此InnoDB引擎设计了 Insert Buffer来提高插入性能 。 Insert Buffer的使用要求: 索引是非聚集索引 索引不是唯一(unique)的 只有满足上面两个必要条件时,InnoDB存储引擎才会使用Insert Buffer来提高插入性能。

    39830

    堂妹问我:innodb是如何插入数据的?

    向B+树中插入16、17、18三行数据如下(绿色部分): ? 向B+树继续插入19一行数据,原先的空间已满扩展如下(蓝色部分): ? 如果聚集索引使用的是无顺序的列如uuid,由于B+是一个逻辑上有序的集合,那么向B+树中插入数据就很可能插入到原先已经满了的page页中,就会导致原来的页进行分裂。 如何一步步存储一条数据 经历了千辛万苦,终于可以从头到尾插入一条数据,一探innodb如何一步步把数据存储到文件中。妹妹们估计已经听的如痴如醉,想想都开心,我可真是个小机灵鬼。 插入数据 向表中插入一条数据如下 insert into world.user(name,age,gender,create_time) values('木叶潇潇',18,1,now()) 从sql 根据Root Page中指定的段信息,向Root Page中插入索引数据,向数据段对应的页中插入数据行,并关联两种类型的页。

    31210

    长文-InnoDB中的各种锁

    图片意向锁InnoDB中的意向锁是一种表级锁,用于指示稍后将对表中的行施加那种锁类型(共享锁或排它锁),意向锁是用于提升表级锁(共享锁、排它锁)的加锁效率的。 插入意向(间隙)锁插入意向锁一种用于在INSERT语句进行插入行操作时,对插入行对应的区间设置的一种间隙锁。插入意向锁是间隙锁,注意和前面提到的意向锁(表级锁)进行区分。为什么需要插入意向锁? 为了防止幻读,在执行插入时,需要有一种锁与临键锁/间隙锁进行互斥。如果插入也使用间隙锁,加锁的区间一次就只能插入一条记录。并发性差插入意向锁就是基于以上原因设计的,插入意向锁之间相互兼容。 (只要没有唯一键冲突)插入意向锁和记录锁、间隙锁、临键锁互斥。自增锁 AUTO-INC Locks自增锁是一种特殊的表级锁,在向带有自增列的表进行INSERT动作时使用。 在深入理解自增锁之前,我们先了解下INSERT预计的三种类别(参考InnoDB AUTO_INCREMENT Lock Modes)Simple inserts: 我们可以提前知道插入行数的INSERT

    34090

    你需要了解关于MySQL锁的知识点,都列在这里了!

    意向锁(Intention Locks) InnoDB为了支持多粒度锁机制(multiple granularity locking),即允许行级锁与表级锁共存,而引入了意向锁(intention locks 插入意向锁(Insert Intention Locks) 对已有数据行的修改与删除,必须加强互斥锁(X锁),那么对于数据的插入,是否还需要加这么强的锁,来实施互斥呢?插入意向锁,孕育而生。 后执行,也在10与20两条记录中插入了一行: insert into t values(12, ooo); 因为是插入操作,虽然是插入同一个区间,但是插入的记录并不冲突,所以使用的是插入意向锁,此处A IX锁),保证同一行记录修改与删除的串行性; 2.按锁的粒度来划分,可以分为: 表锁:意向锁(IS锁、IX锁)、自增锁; 行锁:记录锁、间隙锁、临键锁、插入意向锁; 其中 InnoDB的细粒度锁(即行锁 ),是实现在索引记录上的(我的理解是如果未命中索引则会失效);   记录锁锁定索引记录;间隙锁锁定间隔,防止间隔中被其他事务插入;临键锁锁定索引记录+间隔,防止幻读; InnoDB使用插入意向锁,可以提高插入并发

    31110

    RC隔离级别下的间隙锁案例

    2、插入意向锁 插入意向锁之间是不冲突的,插入意向锁也是一种间隙锁,他的存在是为了提高插入的并发度。 在申请插入意向锁的时候,需要判断当前插入记录位置的下一条记录上是否持有锁,如果有,则需要判断是否与插入意向锁冲突。如果没有,则不需要判断,直接加上插入意向锁。 这里有必要将innodb中常见的锁种类说明一下: ? 可以看到lock mode S 代表的是next_key锁。 那么为什么innodb需要加S型的间隙锁呢? (因为插入的是1,意向锁的),由于session B和session C的S锁之间不冲突,所以session B和session C的插入都会成功。 所以这里需要添加S类型的Next-key Lock来让插入意向锁发生冲突,从而实现锁冲突,阻止记录同时插入

    2.7K21

    简单了解 MySQL 中相关的锁

    Locks) 插入意向锁(Insert Intention Locks) 自增锁(AUTO-INC Locks) 即使按照这种分类来对锁进行了划分,看到了这么多的锁的名词可能仍然会有点懵。 意向锁InnoDB 中支持了不同粒度的锁,行锁和表锁。例如lock tables命令就会持有对应表的排他锁。为了使多种不同粒度的锁更实用,InnoDB 设计了意向锁。 那 InnoDB 需要如何感知 A 获取了这把锁?遍历整个 B+ 树吗?不,答案就是意向锁插入意向锁 接下来是插入意向锁(Insert Intention Locks),当我们执行 INSERT 语句之前会加的锁。本质上是间隙锁的一种。 还是举个例子,假设我们现在有索引记录10、20,事务A、B分别插入索引值为14、16的数据,此时事务A和B都会用插入意向锁锁住 10-20 之间的 Gap,获取了插入意向锁之后就会获取14、16的排他锁

    6420

    InnoDB实现了两种类型的行锁

    另外,为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁。 也就是说:1.意向锁是表级锁,但是却表示事务正在读或写某一行记录;2.意向锁之间不会冲突, 因为意向锁仅仅代表要对某行记录进行操作,在加行锁时,会判断是否冲突;3.意向锁InnoDB自动加的,不需用户干预 InnoDB使用间隙锁的目的,一方面是为了防止幻读,以满足相关隔离级别的要求,对于上面的例子,要是不使用间隙锁,如果其他事务插入了empid大于100的任何记录,那么本事务如果再次执行上述语句,就会发生幻读 很显然,在使用范围条件检索并锁定记录时,InnoDB这种加锁机制会阻塞符合条件范围内键值的并发插入,这往往会造成严重的锁等待。 从上面两点可知,MySQL的恢复机制要求:在一个事务未提交前,其他并发事务不能插入满足其锁定条件的任何记录(比如上面的>100都会锁定的例子,只要不插入>100的数,就不会幻读),也就是不允许出现幻读,

    11610

    InnoDB锁机制

    InnoDB使用的锁类型,分别有: 共享锁(S)和排他锁(X) 意向锁(IS和IX) 自增长锁(AUTO-INC Locks) 1.1. 意向锁 InnoDB 支持多粒度的锁,允许一行记录同时持有兼容的行锁和表锁。意向锁是表级锁,表明一个事务之后要获取表中某些行的 S 锁或 X 锁。 插入意向锁 插入意向锁是一种在数据行插入前设置的gap锁。这种锁用于在多事务插入同一索引间隙时,如果这些事务不是往这段gap的同一位置插入数据,那么就不用互相等待。假如有4和7两个索引记录值。 ,这个事务在等待获取互斥锁之前,获取了一把插入意向锁。 mysql> START TRANSACTION; mysql> INSERT INTO child (id) VALUES (101); 插入意向锁 使用 SHOW ENGINE INNODB STATUS

    66750

    MySQL中的锁机制

    假设有值为4和7的索引记录,现在有两事务分别尝试插入值为 5 和 6 的记录,在获得插入行的排他锁之前,都使用插入意向锁锁住 4 和 7 之间的间隙,但两者之间并不会相互阻塞,因为这两行并不冲突。 插入意向锁只会和 间隙或者 Next-key 锁冲突,正如上面所说,间隙锁作用就是防止其他事务插入记录造成幻读,正是由于在执行 INSERT 语句时需要加插入意向锁,而插入意向锁和间隙锁冲突,从而阻止了插入操作的执行 插入意向锁较为特殊,所以我们先对插入意向锁做个总结,如下: 插入意向锁不影响其他事务加其他任何锁。 也就是说,一个事务已经获取了插入意向锁,对其他事务是没有任何影响的; 插入意向锁与间隙锁和 Next-key 锁冲突。 也就是说,一个事务想要获取插入意向锁,如果有其他事务已经加了间隙锁或 Next-key 锁,则会阻塞。

    27320

    插入InnoDB自增列,居然是表锁?

    插入InnoDB自增列,居然是表锁? 强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码 《挖坑,InnoDB的七种锁》初步说明了InnoDB中,会使用七种不同类型的锁,今天就介绍其中的第一种 最简单的情况,如果一个事务正在往表中插入记录,所有其他事务的插入必须等待,以便第一个事务插入的行,是连续的主键值。 与此同时,InnoDB提供了innodb_autoinc_lock_mode配置,可以调节与改变该锁的模式与行为。 四,假如不是自增列 上面的案例,假设不是自增列,又会是什么样的情形呢? 相关文章: 《InnoDB并发如此高,原因竟然在这?》 《InnoDB,5项最佳实践,知其所以然?》 《带团队,不要轻易放弃任何一个队友》 知识,即使一小点,也是好的,转。

    16530

    详细介绍MySQL中常见的锁

    这段话表明尽管插入意向锁是一种特殊的间隙锁,但不同于间隙锁的是,该锁只用于并发插入操作。如果说间隙锁锁住的是一个区间,那么插入意向锁锁住的就是一个点。 因而从这个角度来说,插入意向锁确实是一种特殊的间隙锁。 与间隙锁的另一个非常重要的差别是:尽管插入意向锁也属于间隙锁,但两个事务却不能在同一时间内一个拥有间隙锁,另一个拥有该间隙区间内的插入意向锁(当然,插入意向锁如果不在间隙锁区间内则是可以的)。 接着事务一请求插入意向锁,这时发现事务二已经获取了一个区间间隙锁,而且事务一请求的插入点在事务二的间隙锁区间内,因而只能等待事务二释放间隙锁。 场景二中,两个间隙锁没有交集,而各自获取的插入意向锁也不是同一个点,因而都能执行成功。 往期精选

    17240

    Mysql锁机制

    InnoDB引擎锁类型: 共享/排它锁 记录锁 间隙锁 临键锁 自增锁 意向锁 插入意向锁 MySQL中InnoDB存储引擎与MyISAM存储引擎锁机制其实有两个比较显著的不同点: InnoDB支持事务操作 InnoDB默认采用行级锁。 InnoDB锁机制实现原理 InnoDB存储引擎其实是通过给索引上的索引项添加锁,也正是由于给索引项加锁,所以只有通过索引条件查询数据,InnoDB引擎才会选择使用行级锁,否则会使用表锁。 插入意向锁 插入意向锁是作用于索引上,专门用于插入操作的锁。这个锁是可以多个事务共同操作的,多个事务同时操作同一个索引,在插入记录时如果插入位置不冲突则不会互相影响插入操作。 表锁注意事项 刚才其实提到了,InnoDB中默认使用行级锁,但是意向锁这种表级锁其实有时候更适合,比如需要在事务中更新大部分数据,这时候使用表锁就可以提高事务的执行任务。

    24220

    扫码关注腾讯云开发者

    领取腾讯云代金券