Mysql 锁机制
一、概述
(1) 定义
(2) 实例介绍:生活购物
(3) 锁的分类
① 从数据操作的类型(读、写)分
读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响
写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。
② 从对数据操作的颗粒度 分
- 表锁
- 行锁
二、三锁 (表,行,页锁)
(1) 表锁(偏读)★
① 特点
偏向MyISAM存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发最低
② 案例分析
1. 增加/释放表锁:
增加 表锁语句
lock table 表名1 read(write), 表名2 read(write) .....;
释放 表锁语句
unlock tables;
2. 加读锁:
3. 加写锁:
③ 案例结论
④ 表锁分析
(2) 行锁(偏写)★
① 特点
偏向InnoDB存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
InnoDB与MyISAM的最大不同有两点:
一是支持事务(TRANSACTION);
二是采用了行级锁
② 行锁支持事务 (复习老知识)
1. 事务(Transation)及其ACID属性
2. 并发事务处理带来的问题
-
更新丢失(Lost Update)
-
脏读(Dirty Reads)
-
不可重复读(Non-Repeatable Reads)
-
幻读(Phantom Reads)
3. 事务隔离级别
查看事务的隔离级别:show variables like "%tx_isolation%";
③ 案例分析
1. 行锁定基本演示
2. 无索引行锁升级为表锁
varchar 不用 ' ' 导致系统自动转换类型, 行锁变表锁
3. 间隙锁危害
4. 面试题:常考如何锁定一行
④ 案例结论
⑤ 行锁分析
检查innodb的行锁状态:show status like "%innodb_row_lock%";
⑥ 优化建议
- 尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
- 合理设计索引,尽量缩小锁的范围
- 尽可能减少检索条件,避免间隙锁
- 尽量控制事务大小,减少锁定资源量和时间长度
- 尽可能低级别事务隔离
(3) 页锁 (了解)
开销和加锁时间界于表锁和行锁之间:会出现死锁;
锁定粒度界于表锁和行锁之间,并发度一般。