10 分钟阅读 521 字 + 1254 词
七、MySQL的锁机制
1、锁的分类
对数据操作的 粒度 划分
== 表级锁 ==:开销小,加锁快; 不会出现死锁 ;锁定粒度大,发生锁冲突的概率最高,并发度最低。 == 行级锁 ==:开销大,加锁慢; 会出现死锁 ;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
从对 数据操作 的类型划分: == 读锁(共享锁) ==: 同一份数据,多个读操作可以同时进行而互不影响。 == 写锁(排它锁) ==: 当前操作没有完成之前,它会阻断其他读锁和写锁。
2、MyISAM的表锁
mysql
lock table 表名  read; (加读锁)
lock table 表名  write; (加写锁)
2.1、左边会话将某张表加了读锁之后,右边会话可以进行读该表,但是不能进行写
image-20230701112635457
2.2、左边会话对某张表加了读锁之后,本会话对本表可以进行读但是不能写
image-20230701112903572
2.3、左边会话对某张表加了读锁之后,右边会话也可以对同一张表加读锁。
image-20230701113411645
可以查看锁的占用情况
show open tables
image-20230701113227985
2.4、左边会话对test_myisam加了读锁之后,左边会话可以读test_myisam这张表,但是不能读test_myisam之外的表,除非先对其他表加读锁,才能执行读操作**(一心不能二用)**
2.5、左边会话加写锁的特点
image-20230701114225579
总结:读共享,写排它
3、InnoDB的行锁
mysql
SELECT ... LOCK IN SHARE MODE; #加读锁
SELECT ... FOR UPDATE;#加写锁
image-20230701115341477
4、间隙锁(==重要==)
锁的是一个间隙(范围),就不能在间隙中进行写操作。
image-20230701120037474
在线上在 执行 update、delete、select ... for update 等具有加锁性质的语句 ,一定要检查语句是否走了索引,如果是 全表扫描的话,会对每一个索引加 next-key 锁,相当于把整个表锁住了