行锁
- InnoDB行锁是通过给索引上的索引项加锁来实现的,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!
- 原因
- select(主动加了锁的情况下),delete,update sql语句没有使用到索引,如果使用的是普通索引也有可能造成表锁,具体要看索引列上的重复数据是不是很多
- 解决方案
- update,delete,select(主动加锁的情况下)条件使用主键索引或者唯一索引
查看当前数据库锁的情况
show status like 'innodb_row_lock%';查看当前行锁的情况
- select不会阻塞任何操作
- update,delete 都会被隐式加上排它锁,行级别
- update,delete 多条记录的情况下,根据条件逐行锁定
- insert 不会阻塞select,update,delete,至于有没有加锁,锁的机制是什么,不清楚
- 应用声景
- 在一个显式事务中,主要用在需要数据依存关系时来确认某行记录是否存在,并确保没有人对这个记录进行UPDATE或者DELETE操作
- 共享锁
- 如果当前事务也需要对该记录进行更新操作,则很有可能造成死锁
- 排它锁
- 如果当前事务也需要对该记录进行更新操作,则使用排它锁
- select使用示例
select * from t for update 排它锁 select * from t lock in share mode 共享锁