一、锁的分类

image.png
  • 对数据操作的类型
    • 读锁(共享)
    • 写锁(排他)
  • 对数据操作的粒度
    • 表锁(偏读)
    • 行锁(偏写)

二、表锁

偏向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     |        从系统启动至今等待次数
+-------------------------------+-------+

*/

你可能感兴趣的:(锁)