Mysql—锁相关面试题(全局锁,表级锁,行级锁)
文章目录
- 锁的分类
- 表锁和行锁的作用
- MYSQL两个线程update语句同时处理一条语句,会不会有阻塞?
- 如果2个范围不是主键或索引?还会阻塞吗?
锁的分类
- 1.全局锁
通过 flush tables read wirh lock,语句会将整个数据库处于只读状态,此时其他线程进行增删改,或者表结构的修改就会进行阻塞。全局锁主要用于全库数据备份。防止在备份整个数据时,其他线程操作数据库,使备份的数据库数据与真实数据库数据不一致。
- 2.表级锁
表级锁分为以下几种锁:
- 表锁:通过lock tables 语句可以对表加表锁,表锁会限制本线程以及其他线程的读写
- 元数据锁:当我们对数据库表进行操作时,会自动加上元数据锁(MDL),对表进行CRUD时加的是MDL读锁。当对表结构进行修改时,加的是MDL写锁。元数据锁是为了防止在进行CRUD时其他线程对表结构进行变更。
- 意向锁 :当执行更新,插入,删除操作时,需要先对表加上意向独占锁,然后对该记录加上独占锁。意向锁的目的是快速判断表里是否有记录被加锁
- 3.行级锁:InnoDB 引擎是支持行级锁的,而 MyISAM 引擎并不支持行级锁。
- 记录锁,锁住的是一条记录。而且记录锁是有 S 锁和 X 锁之分的,满足读写互斥,写写互斥
- 间隙锁,只存在于可重复读隔离级别,目的是为了解决可重复读隔离级别下幻读的现象。
- Next-Key Lock 称为临键锁,是 Record Lock + Gap Lock 的组合,锁定一个范围,并且锁定记录本身。
表锁和行锁的作用
表锁的作用:
- 整体控制:表锁可以用来控制整个表的并发访问,当一个事务获取表锁时,其他事务无法对该表进行任何读写操作,从而保证数据的一致性。
- 颗粒度大:表锁的颗粒度比较大,在锁定表操作时,可能会影响到表的其他操作。可能引起锁的竞争和性能问题。
- 适用于大批量操作:表锁适合于需要大批量操作表中数据的场景,例如表的重建、大量数据的加载等。
行锁的作用: - 细颗粒度控制:行锁可以精确控制对表中某行数据的访问,使得其他事务可以同时访问表中其他行数据。提高并发性能。
- 减少锁冲突:行锁不会像表锁那样造成整个表的冲突,减少了锁竞争,提高并发访问效率。
- 适用于频繁单行操作:行锁适用于需要频繁对表中数据单独操作的场景。
MYSQL两个线程update语句同时处理一条语句,会不会有阻塞?
会,因为 InnoDB 存储引擎实现了行级锁。当A事件对id=1这行数据进行update操作时,会对主键为1的记录添加x类型的记录锁。这样事务2对其再进行更新时会发现已经存在记录锁,进程就会阻塞。
如果2个范围不是主键或索引?还会阻塞吗?
如果2个范围查询的字段不是索引的话,那就代表 update 没有用到索引,这时候触发了全表扫描,全部索引都会加行级锁,这时候第二条 update 执行的时候,就会阻塞了。因为如果 update 没有用到索引,在扫描过程中会对索引加锁,所以全表扫描的场景下,所有记录都会被加锁,也就是这条 update 语句产生了 4 个记录锁和 5 个间隙锁,相当于锁住了全表。