SQL5

分析表锁定

//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;

你可能感兴趣的:(SQL5)