美文网首页
3.行级锁

3.行级锁

作者: 资深菜鸡程序员 | 来源:发表于2021-06-09 18:03 被阅读0次

    行级锁介绍

    InnoDB存储引擎实现

    一. InnoDB的行级锁,按照锁定范围来说,分为三种:

    1.记录锁(Record Locks):锁定索引中一条记录。 主键指定 where id=3

    2.间隙锁(Gap Locks): 锁定记录前、记录中、记录后的行 RR隔离级 (可重复读)-- MySQL默认隔离级

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

    3.Next-Key 锁: 记录锁 + 间隙锁

    二.InnoDB的行级锁,按照功能来说,分为两种:(以下案例都是在同一个事务中)

    1.共享读锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁共享读不能。
    select * from mylock where id=1 LOCK IN SHARE MODE;

    加完锁以后在事务未提交时候同session可以修改操作,和读操作,不同session不可以修改操作但可以读操作。

    在同一个事务   中如果在没有索引的字段上添加读锁会导致锁升级到表锁,会把整张表锁住。

    2.排他写锁(X):允许获得排他写锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁(不是读)和排他写锁。

    手动添加:SELECT * FROM table_name WHERE ... FOR UPDATE;

    写锁是自动添加的,在同一个session中未提交的时候可以读取和修改 ,不同session可以读操作因为读不加锁,不可以写操作。

    3.InnoDB也实现了表级锁,也就是意向锁,意向锁是mysql内部使用的,不需要用户干预。

    意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。

    意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。

    意向锁的主要作用是为了【全表更新数据】时的性能提升。否则在全表更新数据时,需要先检索该表是否某些记录上面有行锁。

    三.间隙锁

    间隙锁防止两种情况

    1、防止插入间隙内的数据

    2、防止已有数据更新为间隙内的数据

    下面是案例数据:


    间隙的范围:

    update news set number=3 where number=4;

    number:234

    id:12345

    产生间隙锁情况,不同session在事务中操作:

    1.非唯一索引等值(只要number(where后面的)在间隙里(2 3 4),不包含最后一个数(5)则不管id是多少都会阻塞)

    update news set number=3 where number=4;

    2.主键索引范围(只要id(在where后面的)在间隙里(2 4 5),则不管number是多少都会阻塞)

     update news set number=3 where id>1 and id <6;

    3.非唯一索引无穷大(id和number同时满足注:非主键索引产生间隙锁,主键范围产生间隙锁)

    update news set number=3 where number=13 ;

    相关文章

      网友评论

          本文标题:3.行级锁

          本文链接:https://www.haomeiwen.com/subject/nvumtltx.html