MySQL 的两个层面并发控制:
- 服务器层
- 存储引擎层
读写锁
处理并发读或写的两种类型锁:
- 共享锁(
shared lock
):又称读锁(read lock
)- 共享,或者说相互不阻塞
- 多个用户可在同时刻同时读取同一个资源,而互不干扰
- 排它锁(
exclusive lock
):又称写锁(write lock
)- 排他,一个写锁会阻塞其他的写锁和读锁
- 确保在给定的时间里,只有一个用户能执行写入,并防止其他用户读取正在写入的同一资源
锁粒度
提高共享资源并发性的方式是让锁定的对象更具有选择性。尽量只锁定需要修改的部分数据,而不是所有资源。
理想的方式:只对修改的数据片进行精确的锁定。锁定的数据量越少,系统的并发程度越高。
加锁需要消耗资源:锁的操作如:获得锁、检查锁是否解除、释放锁等均会增加系统开销。
锁策略:锁的开销和数据的安全性寻求平衡。
- 表锁(table lock):
- MySQL 最基本所策略,性能开销最小。
- 锁定整张表,一个在线的写操作(插入、删除、更新等)需要先获得写锁,阻塞其他用户的所有读写操作。
- 写锁比读锁有更高的优先级:即一个写锁请求可能会插入到读锁队列的前面。
- 写锁可以插入到锁队列中读锁的前面,反之读锁则不能插入到写锁的前面。
- 行级锁(row lock):
- 行级锁可以最大程度支持并发处理,同时带来更大的锁开销。
- 在 InnoDB 和 XtraDB 等存储引擎中实现了行级锁。
- 行级锁只在存储引擎实现,在 MySQL 服务层并没有实现。