mysql进阶(七)数据库锁
什么是锁?
对数据操作的类型:
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%';
总结:
页锁:
还没有评论,来说两句吧...