mysql进阶(七)数据库锁

绝地灬酷狼 2022-05-18 06:13 211阅读 0赞

什么是锁?

70

对数据操作的类型:

70 1

70 2

1.表锁:

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

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

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

写锁:只能写,不能读

70 3

如何分析表锁定:

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

  1. show status like 'table%';

70 4

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

70 5

2.行锁

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

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

70 6

脏读:

70 7

不可重复读:

70 8

幻读:

70 9

事务隔离级别:

70 10

涉及到的表:

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

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

70 11

间隙锁

70 12

70 13

70 14

如何锁定一行:

70 15

70 16

行锁的分析:

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

  1. show status like 'innodb_row_lock%';

70 17

70 18

总结:

70 19

页锁:

70 20

发表评论

表情:
评论列表 (有 0 条评论,211人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Mysql-事务&

    前置知识-事务 事务简介 事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要