概述
- 定义
- 生活购物
- 锁的分类
-
- 从对数据操作的类型(读/写)分离
-
- 读锁(共享锁):针对同一份数据,多个读操作可以同时进行,而不会相互影响。
- 写锁(排它锁):当前写操作没有完成,它会阻断其他写锁或读锁。
-
- 从对数据操作的粒度分为
-
- 表锁
- 行锁
三锁(表、行、页)
- 开销、加锁的速度、死锁、粒度、并发性能(具体应用/业务分析合适的锁)
表锁(偏读)
- 特点
-
- 偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁定粒度大,发生冲突的概率高,并发度低。
- 案例分析
- 建表sql
- 加读锁- # lock table mylock read,book write; # mylock 是读锁,book是写锁
- case:
- 加写锁
- mylock 表添加write锁(MyIsAM存储引擎的写阻塞案例)
- 案例结论
- 表锁分析
行锁(偏写)
- 特点
- 偏向InnoDB存储引擎,开销大,加锁慢;
- 会出现死锁;
- 锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
- InnoDB 和 MyISAM 的最大不同(俩点)
- 支持事务
- 行级锁
- 由于行锁支持事务,复习老的知识
- 事务(Traction)及ACID属性
- 并发事务处理带来的问题
- 更新丢失(Lost Update)
- 脏读(Dirty Reads)
- 不可重复读(non-Repeatable Reads)
- 幻影读(Phantom Reads)
- 事务的隔离级别
- 案例分析
- 建表SQL
- 行锁定 基本演示
- 无索引锁升级为表锁
- update test_innodb_lock set a=1 where b=1;
- 如果b 是 varchar 类型的,
- 会导致mysql 数据类型自动转换,
- 索引失效,
- 还会导致 mysql 从行锁升级为表锁,从而导致整个表阻塞。
- 间隙锁危害
- 面试题:如何锁定一行(常考)
- 案例结论
- 行锁分析
- 优化建议