开发者社区> 黎明的烬> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

mysql进阶(七)数据库锁

简介: 什么是锁? 对数据操作的类型: 1.表锁: 偏向myISAM存储引擎,开销小,加锁块;无思索;锁定粒度大,发生锁冲突的概率最高,并发度最低; 读锁:共享读操作,但是不能进行写操作 -- 给表加锁 lock table 表名1 read,表名2 write; -- 查看表的加锁情况 show open tables ; -- 解锁 unlock tables; 写锁:只能写,不能读   如何分析表锁定: 可以通过下面状态变量来分析系统上的表锁定。
+关注继续查看

什么是锁?

对数据操作的类型:

1.表锁:

偏向myISAM存储引擎,开销小,加锁块;无思索;锁定粒度大,发生锁冲突的概率最高,并发度最低;

读锁:共享读操作,但是不能进行写操作


-- 给表加锁
 lock table 表名1  read,表名2 write;
-- 查看表的加锁情况
show open tables ;
-- 解锁
unlock tables;

写锁:只能写,不能读

 

如何分析表锁定:

可以通过下面状态变量来分析系统上的表锁定。

 show status like 'table%';

 Table_locks_immediate:产生表级锁定的次数,表示可以立即获取锁的查询次数,每立即获取锁值加1;
 Table_locks_waited:出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待一次锁值加1),此值高则说明存在着较严重的表级争用的情况

2.行锁

偏向InnoDB存储引擎,开销大,加锁慢;会出现死锁;锁粒度最小,发生锁冲突的概率最低,并发度也最高。

innodb和myisam最大的不同:是支持事务,采用行级锁

 脏读:

不可重复读:

幻读:

 

事务隔离级别:

 

涉及到的表:

create table test_innodb_lock(a int(11),b varchar(16)) engine=innodb;
insert into test_innodb_lock  values(1,'b2');
insert into test_innodb_lock  values(2,'3');
insert into test_innodb_lock  values(4,'40000');
insert into test_innodb_lock  values(5,'5000');
insert into test_innodb_lock  values(6,'6000');
insert into test_innodb_lock   values(7,'7200');
insert into test_innodb_lock  values(8,'8000');
insert into test_innodb_lock  values(9,'9000');
insert into test_innodb_lock  values(10,'1000');
insert into test_innodb_lock  values(1,'b1');

 create index test_innodb_b_ind on test_innodb_lock(b);
 create index test_innodb_a_ind on test_innodb_lock(a);

行锁变成表锁:varchar类型没有加,单双引号;session2阻塞了;

 

间隙锁 

 如何锁定一行:

 

 

行锁的分析:

通过检查innodb_row_lock状态变量来分析系统上的行锁的争夺情况

show status like 'innodb_row_lock%';

总结:

 

页锁:

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
MySQL高并发场景实战
立即下载
MySQL表和索引优化实战
立即下载
MySQL查询优化实战
立即下载