MySQL的锁

目录

1.锁的概述

1.锁的作用:

2.锁的分类:

2.全局锁

3.表级锁

1.表级锁的概述:

2.表级锁分类:

2.1表锁:

2.2元数据锁:

2.3意向锁

4.行级锁

1.行级锁的概述:

2.行级锁的分类

2.1行锁:

2.2间隙锁和临键锁


1.锁的概述


1.锁的作用:

        锁是为了保证数据并发访问一致性


2.锁的分类:

按照锁的粒度分
    * 全局锁:锁定数据库的所有表
    * 表级锁:每次操作锁定整张表
    * 行级锁:每次操作锁住对应行数据

2.全局锁


* 加锁后,数据库处于只读状态,其他操作语句将被阻塞
* 应用场景:全库的逻辑备份
* 备份:将数据库的sql文件备份到磁盘中

3.表级锁


1.表级锁的概述:

        锁定粒度大,发生锁冲突的概率最高,并发度最低


2.表级锁分类:


    * 表锁
    * 元数据锁:meta data lock,MDL
    * 意向锁


2.1表锁:

分为两类
    * 表共享读锁:read lock
    * 表独占写锁:write lock


2.2元数据锁:

系统自动控制,无需显式使用,访问表时自动加上
    * 作用:维护表元数据的一致性
    * 表有活动事务时,无法对元数据进行写入操作
    * 比如在数据写增删改查时,加MDL读共享锁;对表结构进行变更时,加上MDL写锁


2.3意向锁


    * 作用:为了避免表的增删改查操作中、行锁与表锁的冲突
    * 功能:表锁不需要检查每行数据是否加锁,使用意向锁减少表锁的检查
    * 实现:加表锁之前先检查意向锁,若表锁与意向锁不兼容则直接阻塞,等到行锁接触后再加表锁
    * 分类
        * 意向共享锁:和读锁兼容,和写锁互斥
        * 意向排他锁;和读锁和写锁都互斥

4.行级锁


1.行级锁的概述:

        锁定粒度最小,发生锁冲突的概率最低,并发度最高,主要应用于InnoDB中
* InnoDB数据是基于索引的,行锁是通过索引上的索引项加锁实现的,并不是对行纪录加锁


2.行级锁的分类


    * 行锁:Record Lock锁定单行记录的锁
    * 间隙锁:Gap Lock锁定索引记录的间隙(不包含该记录),确保该间隙不变,防止其他事务对该间隙进行insert产生幻读
    * 临键锁:Next-Key Lock行锁和间隙锁的组合


2.1行锁:


    * 分为共享锁和排他锁
    * 共享锁:允许一个事务读一行,组织其他事务获得相同数据集的排他锁;即共享锁之间兼容,共享锁与排他锁互斥
    * 排他锁:允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁;

            * 增删改:排他锁
            * select:不加任何锁

MySQL的锁_第1张图片
    * 行锁在默认事务隔离级别运行,使用next-key锁进行搜索和扫描,从而防止幻读
    * 针对唯一索引进行检索时自动优化为行锁
    * InnoDB是针对索引加的锁,不通过索引条件检索数据,则InnoDB将对表的所有记录加锁,此时升级为表锁

 

2.2间隙锁和临键锁


    * 索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁
    * 索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock自动退化为间隙锁
    * 索引上的范围查询(唯一索引),会访问到不满足条件的第一个值为止
    * 注意:间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙采用间隙锁

你可能感兴趣的:(Java日常学习,mysql,数据库)