表锁:
读锁(共享锁):对同一个数据,多个读操作可以同时进行,互不干扰。
写锁(互斥锁):同一个数据只有一个用户可以在一个时间进行操作。
表锁:
一次对一个表进行加锁,mylsam使用表锁,开销小,加锁快,无死锁,容易发生表冲突,并发度低。
行锁:
一次对一行进行加锁,innodb使用行锁,开销大,加锁慢,容易出现死锁。并发度低,不容易发生表冲突。
读锁:
每一个访问数据的dos命令行,和对数据库客户端工具都是一个会话。
锁机制:lock table 表名 read;
解锁:unlock tables;
如果会话0一直读取着表,那么会话1就不能对表进行更改,只能进行读取。
写锁:
如果对表进行锁住后,会话0如果占用着表,那么会话1就不能对表进行crud操作。
MySQL表级锁的锁模式
MyISAM在SELECT操作时,会自动给设计的表加读锁。
进行DML操作时,会自动给表加写锁
表锁通过unlock tables释放锁,行锁通过commit提交事务或者rollback回滚事务,来释放锁
行锁,不同会话对不同的数据进行操作,互不干扰
如果没有索引,行锁会转为表锁
如果出现索引失效的操作,就会导致行锁变为表锁,会话之间互相等待
间隙锁: 行锁的一种特殊情况,在范围之内却不存在。
行锁分析
#行锁分析
SHOW STATUS LIKE '%innodb_row_lock%';
Innodb_row_lock_current_waits:当前等待锁的数量
Innodb_row_lock_time:等待总时常,从系统启动到现在的等待总时常
Innodb_row_lock_time_avg:平均等待时常
Innodb_row_lock_time_max:最长等待时常
Innodb_row_lock_waits:等待次数