锁粒度(Lock Granularity)指的是锁保护的数据范围大小,分为细粒度和粗粒度:
- 细粒度锁保护较小的数据量,适合高并发场景,但管理开销大;
- 粗粒度锁保护较大的数据量,减少锁竞争,但可能降低并发性能。
- 全局锁(Global Lock):锁定 数据库 所有表 table
- 表级锁(Table-Level Lock):操作时 锁住 整张表
- 行级锁(Row-Level Lock):操作时 锁住 对应行数据
全局锁(Global Lock)
主要处理多张表的保存,加全局锁,DQL只读状态,阻塞DML/DDL(增删改 定义)列如:订单表,库存表,不加锁出现下单未减少库存量
一般用在 逻辑备份 ,对所有表锁定,完整性
#加全局锁 加了 只能select 查询 flush将缓冲区中的数据强制写入持久存储(如磁盘)或清空缓存的操作
flush tables with read lock;
#数据备份 就是保存数据sql 在cmd 执行 密码 数据库名 地址
mysqldump -uroot -p1234 db01>D:\db01.sql
#解锁
unlock tables;
##不加锁 加参数
mysqldump --single-transaction -uroot -p1234 db01>D:\db01.sql
缺点:在主库备份 ,业务得停下来, 在从库备份,没有主库同步的 二进制(bin.log)主从不一致!
解决方法:在InnoDB中,备份时加 --single-transaction(单个交易) 参数来完成不加锁,一致性数据备份。
表级锁(Table-Level Lock)(表锁(共享读锁,独占写锁),元数据锁,意向锁)
主要处理 一张表中数据的改变,锁住一张表,锁粒度大,容易发生锁冲突,并发度低
- 表锁
- 表共享读锁(read lock)
- 表独占写锁 (wirte lock)
- 元数据锁(meta data lock ,MDL)
- 意向锁
表锁(读锁 只可读不可写 /写锁 当前客户端 既可以读也可以写 其他客户端一律不可以!)
#加 读锁 只可读不可写
lock table employee read;
#解锁
unlock tables;
#加 写锁 当前客户端 既可以读也可以写 其他客户端一律不可以!
lock table employee write;
元数据锁(自动会用,当事务时不可以对数据进行 写操作 避免DML/DDL(增删改/定义)的冲突)
#开启事务
begin;
#两个客户端执行 查询语句没问题,自动加了元数据锁
select * from employee ;
#如果没有提交 一个人查询 另一个人不可以 alter 修改
#提交事务
commit;
意向锁(自动加上意向共享锁 ,避免DML(增删改)行锁与表锁 的冲突 加入意向锁,减少表锁的检查,总之读读兼容,读写互斥,写写互斥)
#开启事务
begin;
#加了行锁 record 记录 自动加上意向共享锁
select * from employee where id=1 lock share mode ;
##另一个客户端 可以加读锁 因为兼容 读读兼容,读写互斥,写写互斥
lock tables employee read;
#提交事务
commit;
行级锁(Row-Level Lock)(行锁,间隙锁,临键锁)主要避免幻读,插入一条记录
锁粒度最小 ,很少发生锁冲突,并发度高
InnoDB的数据是基于,索引组织的 ,行锁对 索引进行加锁 ,而不是对记录行加锁
- 行锁(record lock): 锁定行数据,防止 其他事务 update / delete RC已提交 RR可重复读隔离级别支持
- 间隙锁(Gap lock):顾名思义,锁定 索引前后的间隙(不含记录),防止在间隙插入一条数据(防幻读)
- 临键锁(Next-Key lock): 单个行锁和 单个间隙锁的组合,同时锁住数据和间隙 在RR可重复读和隔离级别支持