简单讲解:数据库锁(全局锁,表级锁(表锁,元数据锁,意向锁),行级锁)作用和处理场景

锁粒度(Lock Granularity)指的是锁保护的数据范围大小,分为细粒度和粗粒度:

  • 细粒度锁保护较小的数据量,适合高并发场景,但管理开销大;
  • 粗粒度锁保护较大的数据量,减少锁竞争,但可能降低并发性能。
  1. 全局锁(Global Lock):锁定 数据库 所有表 table
  2. 表级锁(Table-Level Lock):操作时 锁住 整张表
  3. 行级锁(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)(表锁(共享读锁,独占写锁),元数据锁,意向锁

主要处理 一张表中数据的改变,锁住一张表,锁粒度大,容易发生锁冲突,并发度低

  1. 表锁
  • 表共享读锁(read lock)
  • 表独占写锁 (wirte lock)
  1. 元数据锁(meta data lock ,MDL)
  2. 意向锁
表锁(读锁 只可读不可写 /写锁 当前客户端 既可以读也可以写 其他客户端一律不可以!)
#加 读锁  只可读不可写 
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的数据是基于,索引组织的 ,行锁对 索引进行加锁 ,而不是对记录行加锁

  1. 行锁(record lock): 锁定行数据,防止 其他事务 update / delete RC已提交 RR可重复读隔离级别支持
  2. 间隙锁(Gap lock):顾名思义,锁定 索引前后的间隙(不含记录),防止在间隙插入一条数据(防幻读)
  3. 临键锁(Next-Key lock): 单个行锁和 单个间隙锁的组合,同时锁住数据和间隙 在RR可重复读和隔离级别支持
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值