MySQL高级——MySql锁机制(表锁)

本文详细介绍了MySQL中MyISAM存储引擎的表锁特性,包括读锁和写锁的使用、加锁与释放操作,以及锁的兼容性和并发控制。通过案例展示了读锁与写锁对数据查询和修改的影响,强调了读锁不会阻塞读但阻塞写,而写锁会阻塞读和写。通过对MySQL锁机制的分析,提供了表级锁定的监控与优化建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、MySql表锁(偏读)特点

  • 偏向MyISAM存储引擎;
  • 开销小,加锁快;
  • 无死锁;
  • 锁定粒度大,发生锁冲突的概率最高,并发度最低。

二、建表SQL

  • 创建mylock表的SQL

    CREATE TABLE mylock (
      id INT(11) NOT NULL AUTO_INCREMENT,
      username VARCHAR(20) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MYISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
    
    INSERT INTO mylock(username) VALUES('a');
    INSERT INTO mylock(username) VALUES('b');
    INSERT INTO mylock(username) VALUES('c');
    INSERT INTO mylock(username) VALUES('d');
    INSERT INTO mylock(username) VALUES('e');
    

    在这里插入图片描述

  • 创建book表的SQL

    CREATE TABLE book (
      id INT(11) NOT NULL AUTO_INCREMENT,
      bookname VARCHAR(20) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MYISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
    
    INSERT INTO book(bookname) VALUES('java');
    INSERT INTO book(bookname) VALUES('c++');
    INSERT INTO book(bookname) VALUES('.net');
    INSERT INTO book(bookname) VALUES('python');
    INSERT INTO book(bookname) VALUES('vue');
    

    在这里插入图片描述

三、MySql手动增加表锁的案例分析

1、查看表是否加过的锁

SHOW OPEN TABLES;

在这里插入图片描述在这里插入图片描述

2、手动增加表锁语法

 lock table 表名字1 read(write),表名字2 read(write);

3、手动给mylock表增加读锁,book表增加写锁

lock table mylock read,book write;

在这里插入图片描述

4、再次查看表是否加过的锁

SHOW OPEN TABLES;

在这里插入图片描述在这里插入图片描述

四、MySql手动释放表锁的案例分析

1、手动释放表锁语法

unlock tables;

2、释放给表增加的锁

unlock tables;

在这里插入图片描述
3、再次查看表是否加过的锁

SHOW OPEN TABLES;

在这里插入图片描述在这里插入图片描述

五、MySql手动增加表的(读锁)案例分析

1、在(客户端1)中,手动增加mylock表的读锁

lock table mylock read;

在这里插入图片描述
2、在(客户端2)中是否能查询到(客户端1)中上锁的mylock表数据。如下图:
在这里插入图片描述

  • 结论:(客户端1)中手动增加mylock表的读锁,(客户端1)能查看到mylock表的数据,(客户端2)也能查看到mylock表的数据。

3、在(客户端1)中,是否能手动修改mylock表的数据,如下图:
在这里插入图片描述

  • 结论:(客户端1)中手动修改mylock表的数据,会提示mylock表增加了表的读锁,因此不能被修改。

4、在(客户端1)中,是否能查询除mylock表以外的其他表数据,如下图:
在这里插入图片描述

  • 结论:(客户端1)中不能查询除mylock表以外的其他表数据。

5、在(客户端2)中,是否能修改(客户端1)锁定的mylock表数据如下图:
在这里插入图片描述

  • 结论:(客户端2)中,不能修改(客户端1)锁定的mylock表数据,会一直等待获得锁。

6、在(客户端1)中,释放mylock表锁,然后查看(客户端2)中,修改的数据耗时。如下图:
在这里插入图片描述

六、MySql手动增加表的(写锁)案例分析

1、在(客户端1)中,手动增加mylock表的写锁

LOCK TABLE mylock WRITE;

在这里插入图片描述
2、在(客户端1)中,是否能修改mylock表的数据。

在这里插入图片描述

  • 结论:(客户端1)中,能修改(客户端1)锁定的mylock表数据。

3、在(客户端1)中,是否能查询其他表(即book表)的数据。

在这里插入图片描述

  • 结论:(客户端1)中,不能查询(客户端1)锁定的mylock表数据。

4、在(客户端2)中,是否查询mylock表的数据。
在这里插入图片描述

  • 结论:(客户端2)中,不能查询(客户端1)锁定的mylock表数据。会一直等待获取mylock表的锁。

4、在(客户端1)释放锁之后,(客户端2)是否可以查询到mylock表的数据。
在这里插入图片描述

  • 结论:(客户端1)释放锁之后,(客户端2)可以查询到mylock表的数据。

七、MySql锁机制(表锁)的案例总结

MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。

1、MySQL的表级锁有两种模式

  • 表共享读锁(Table Read Lock)
  • 表独占写锁(Table Write Lock)
锁类型是否兼容读锁写锁
读锁
写锁

2、结论

  • 对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
  • 对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。
  • 简而言之,就是读锁会阻塞写,但是不会堵塞读。而写锁则会把读和写都堵塞。

八、 MySql表锁分析

1、查看哪些表被加锁的命令

show open tables;

2、如何分析表锁定

  • 可以通过检查table_locks_waited 和table_locks_immediate状态变量来分析系统上的表锁锁定;
  • 命令 show status like ‘table%’;
    在这里插入图片描述
  • 这里有两个状态变量记录Mysql内部表级锁定的情况,两个变量说明如下:
  • Table_locks_immediate :产生表级锁定的次数,表示可以立即获取锁的查询次数,每立即获取锁值加1。
  • Table_locks_waited:出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待一次锁值加1),此值高则说明存在着较严重的表级锁争用情况。
  • 此外,Myisam的读写锁调用度是写优先,这也是myisam不合适做写为主表的引擎。因为写锁后,其他线程不能做任何操作,大量更新会使查询很难得到锁,从而造成永远阻塞。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小志的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值