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;
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容