MySQL 的两个层面并发控制:

  • 服务器层
  • 存储引擎层

读写锁

处理并发读或写的两种类型锁:

  • 共享锁(shared lock):又称读锁(read lock
    • 共享,或者说相互不阻塞
    • 多个用户可在同时刻同时读取同一个资源,而互不干扰
  • 排它锁(exclusive lock):又称写锁(write lock
    • 排他,一个写锁会阻塞其他的写锁和读锁
    • 确保在给定的时间里,只有一个用户能执行写入,并防止其他用户读取正在写入的同一资源

锁粒度

提高共享资源并发性的方式是让锁定的对象更具有选择性。尽量只锁定需要修改的部分数据,而不是所有资源。

理想的方式:只对修改的数据片进行精确的锁定。锁定的数据量越少,系统的并发程度越高。

加锁需要消耗资源:锁的操作如:获得锁、检查锁是否解除、释放锁等均会增加系统开销。

锁策略:锁的开销和数据的安全性寻求平衡。

  • 表锁(table lock):
    • MySQL 最基本所策略,性能开销最小。
    • 锁定整张表,一个在线的写操作(插入、删除、更新等)需要先获得写锁,阻塞其他用户的所有读写操作。
    • 写锁比读锁有更高的优先级:即一个写锁请求可能会插入到读锁队列的前面。
      • 写锁可以插入到锁队列中读锁的前面,反之读锁则不能插入到写锁的前面。
  • 行级锁(row lock):
    • 行级锁可以最大程度支持并发处理,同时带来更大的锁开销。
    • 在 InnoDB 和 XtraDB 等存储引擎中实现了行级锁。
    • 行级锁只在存储引擎实现,在 MySQL 服务层并没有实现。