一、锁的分类

- 对数据操作的类型
- 读锁(共享)
- 写锁(排他)
- 对数据操作的粒度
- 表锁(偏读)
- 行锁(偏写)
二、表锁
偏向myIsam引擎,开销小,加锁快,粒度大,并发度小
读锁会阻塞写,不会阻塞其他结合进程对表的读(该进程也无法读其他表)
写锁会阻塞读写
三、行锁
偏向InnoDB,开销大,加锁慢,粒度小,并发度大(行锁支持事务)
行锁的实现是通过事务的隔离,即一个未提交,将为改行自动上锁;
索引失效则会将行锁升级为表锁
为第8行添加行锁
begin;
select * from xxx where a=8 for update;
commit;
3.1 间隙锁
某些操作可能会导致间隙锁:
范围查找修改数据时,会锁定所有符合数据(包括不存在的,比如1345,>1,2也会锁定),即使这个数据不存在
3.2 查看行锁
show status like 'innodb_row_lock%';
/*
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| Innodb_row_lock_current_waits | 0 | 当前锁数量
| Innodb_row_lock_time | 24331 | 从系统启动至今锁定总时间
| Innodb_row_lock_time_avg | 12165 | 每次等待所花费平均时间
| Innodb_row_lock_time_max | 20437 | 从系统启动至今最长一次锁定时间
| Innodb_row_lock_waits | 2 | 从系统启动至今等待次数
+-------------------------------+-------+
*/
网友评论