MySQL 内部锁

行级锁

对数据库的行记录进行加锁

优点:

  • Fewer lock conflicts when different sessions access different rows.
  • 当不同会话访问不同的行时会减少锁的冲突
  • Fewer changes for rollbacks.
  • 在回滚的时候会减少修改量
  • Possible to lock a single row for a long time.
  • 可以长时间锁定单独的一条行记录

表级锁

对正在访问的整个表进行加锁

优点:

  • Relatively little memory required (row locking requires memory per row or group of rows locked)
  • 相对低的内存需求
  • Fast when used on a large part of the table because only a single lock is involved.
  • 对表的许多地方进行更新时,只涉及一个锁,因此非常块
  • Fast if you often do GROUP BY operations on a large part of the data or must scan the entire table frequently.
  • 在经常执行 GROUP BY 操作,或者需要频繁扫描整个表的情况下,非常块。

MySQL 对表加写锁的过程:

  1. 如果没有加在表上,那么给表加上写锁
  2. 否则,将加锁的请求添加到写锁队列

MySQL 对表加读锁的过程:

  1. 如果没有写锁加在表上,那么给表加上读锁
  2. 否则,将加锁的请求添加到读锁队列

选择锁的类型

通常来说,表级锁在以下的情况下优于行级锁:

  • 对表操作的语句是是读操作
  • 对表操作的语句混合了读和写,并且写操作只更新删除 通过key获取的一条记录
UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;
DELETE FROM tbl_name WHERE unique_key_col=key_value;
  • SELECT语句混合了并发的INSERT语句,并且只有少量的UPDATEDELETE语句
  • 对表的有大范围扫描或 对整个进行GROUP BY,而没有写者。