行级锁
对数据库的行记录进行加锁
优点:
- 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 对表加写锁的过程:
- 如果没有锁加在表上,那么给表加上写锁
- 否则,将加锁的请求添加到写锁队列
MySQL 对表加读锁的过程:
- 如果没有写锁加在表上,那么给表加上读锁
- 否则,将加锁的请求添加到读锁队列。
选择锁的类型
通常来说,表级锁在以下的情况下优于行级锁:
- 对表操作的语句是是读操作
- 对表操作的语句混合了读和写,并且写操作只更新或删除 通过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语句,并且只有少量的UPDATE和DELETE语句
- 对表的有大范围扫描或 对整个进行GROUP BY,而没有写者。