分析表锁定
//1说明被加了锁
show open tables;
行锁(InnoDB)
一次锁定一行
create table linelock(
id int(5) primary key auto_increment,
name varchar(20)
)engine = innodb;
insert into linelock(name) values('1');
insert into linelock(name) values('2');
insert into linelock(name) values('3');
insert into linelock(name) values('4');
insert into linelock(name) values('5');
//增删改查会自动添加提交
commit;
为了研究行锁,自动关闭
set autocommit = 0;
插入一条数据
insert into linelock values(6,'a6');
此时还没有commit,还在缓存里面
此时另外一个会话进来了
update linelock set name='ax' where id=6;
更新的时候发现数据被加锁了。知道其他会话将该锁释放掉了
可以通过rollback滚回去
总结
- 一个会话对数据进行DML操作,则其他会话会等待上一个会话提交才能操作。
- 表锁是通过unlock tables解锁,行锁是通过commit/rollback;
行锁注意事项
- 如果没有索引,则行锁会转换成表锁,索引失效 -> 行锁变成表锁
- 表锁可以通过commit解锁
- 行锁一张特殊情况:间隙锁:值在范围内,但是不存在,比如id没有7,我们会自动给7加一个间隙锁
总结
InnoDB - 缺点 行锁锁性能消耗大
- 优点 高并发
行锁分析
show status like '%innodb_row_lock%';
Innodb_row_lock_current_waits:当前等待锁的数量
Innodb_row_lock_time:等待总时长
对查询进行行锁,加上for update
select * from linelock where id = '3' for update;