MySQL锁简述

目录

1 全局锁

1.1 简介

1.2 应用场景

1.3 语法

1.3.1 加全局锁

1.3.2 数据备份

1.3.3 释放锁

2 表级锁

2.1 简介

2.2 表锁

2.3 元数据锁

2.3.1 介绍

2.4 意向锁

2.4.1 介绍

2.4.2 分类

3 行级锁

3.1 行锁

3.1.1 介绍

3.1.2 加锁操作


MySQL分为3类锁:

全局锁:锁定数据库中的所有表

表级锁:每次操作锁住整张表

行级锁:每次操作锁住对应的行数据

1 全局锁

1.1 简介

        全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。

1.2 应用场景

        全库的逻辑备份。当库中的表相互关联,进行备份的时候肯定会有一个备份时间差,此时如果一张表进行了备份,而相关联的表没有进行备份期间,如果业务系统中有新的数据入库,就有可能在未进行备份的表中加入新的数据,而这时候就会造成数据的不一致性。这时候就可以利用全局加锁来解决问题。

1.3 语法

1.3.1 加全局锁

flush tables with read lock;

1.3.2 数据备份

# itcast备份的库   itcast.sql 是存放的备份文件
mysqldump -uroot –p1234 itcast > itcast.sql

1.3.3 释放锁

unlock tables;

2 表级锁

2.1 简介

        每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM
InnoDB BDB 等存储引擎中。
        对于表级锁,主要分为3类: 表锁、元数据锁(meta data lock, MDL)、意向锁

2.2 表锁

对于表锁 ,分为两类:

表共享读锁(read lock):加上表共享读锁之后,都只能读

表独占写锁(write lock):加上表独占写锁之后,只能加锁的一方进行读写操作,其他都不可以进行读或者写操作

语法

加锁:lock tables 表名 read/write;

释放锁:unlock tables;

2.3 元数据锁

2.3.1 介绍

        meta data lock , 元数据锁,简写MDL。

        MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。 MDL 锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。为了避免 DML DDL 冲突,保证读写的正确性。

2.4 意向锁

2.4.1 介绍

        为了避免DML 在执行时,加的行锁与表锁的冲突,在 InnoDB 中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。
        在未加入意向锁的时候,要给一张表加上表锁,要先检查表中每一行数据上面有没有行锁,没有的话才可以加上表锁。而在加入意向锁之后,当给一张表中的一条数据加上行级锁的时候也会加上意向锁。而其他用户在操作这张表的时候,如果要加上表级锁会先检查是否有意向锁,如果

有意向锁就不能加上表级锁,从而不用去每一行的检查有没有行锁。

2.4.2 分类

意向共享锁:由语句select ... lock in share mode(也就是行共享锁)添加 。 与表锁共享锁

(read) 兼容,与表锁排他锁 (write) 互斥。

意向排它锁:由insertupdatedeleteselect...for update(也就是行排它锁)添加 。与表锁共享锁(read)及排他锁(write)都互斥,意向锁之间不会互斥。

可以使用下面语句查看意向锁以及行锁的加锁情况:

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data 
from performance_schema.data_locks;

3 行级锁

行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在 InnoDB存储引擎中。

3.1 行锁

3.1.1 介绍

InnoDB实现了两种类型的行锁:

共享锁:可由多个事务共享,与其他共享锁是兼容的。获取共享锁后,多个事务都能对该行数据进行读操作,但是不能进行修改。

排它锁:排它锁不能与其他锁共存,如果一个事务获得排它锁,其他事务都不能获得该行的锁。获取排它锁的事务可以对该行数据进行读写操作。

3.1.2 加锁操作

SQL行锁类型说明
insert ...排它锁自动加锁
update ...排它锁自动加锁
delete ...排它锁自动加锁
select ...不加锁
select ... lock in share mode共享锁需要手动在select..之后加上 lock in share mode
select ... for update排它锁需要手动造select...之后加for update

 可以使用以下sql,查看意向锁,以及行锁的加锁情况:

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data 
from performance_schema.data_locks;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值