MySQL高级知识(十三)——表锁
前言:锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算机资源(如CPU、RAM、I/O等)的争用外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
1.锁的分类
#1.从对数据操作的类型来分
读锁(共享锁)和写锁(排它锁)
#2.从对数据操作的粒度来分
表锁和行锁
2.表锁(偏读)
特点:偏向MyISAM存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发度低。下面通过案例来说明表锁的一些情况。
#1.创建mylock表,并插入5条数据。注意数据引擎使用的是MyISAM。
drop table if exists mylock;
CREATE TABLE mylock (
id INT PRIMARY KEY auto_increment,
name VARCHAR (20) NOT NULL
) ENGINE MyISAM DEFAULT charset = utf8;
insert into mylock (name) values ('a');
insert into mylock (name) values ('b');
insert into mylock (name) values ('c');
insert into mylock (name) values ('d');
insert into mylock (name) values ('e');
#2.手动增加表锁命令。
lock table tablename1 read(write),tablename2 read(write);
#3.查看表是否被加锁。
如果In_use显示不为0,则表示表被加锁。
#4.释放表锁命令
unlock tables;
3.表锁(read)案例
#1.在mylock表上加读锁。将当前会话命名为A。

在A会话中查询mylock中的数据。

数据查询正常,没有任何问题。
#2.再开一个会话,命名为B,查询mylock中的数据。

数据查询正常,没有任何问题。
#3.进行其他操作。
①在A会话中进行更新操作。

分析:
提示mylock表被加锁,不能进行更新操作。原因:mylock正被读锁锁住,未解锁不能进行更新操作。
②在B会话中读其他表。

分析:
A会话mylock表的读锁,并不影响B会话对mylock表和其他表的读操作。
③在A会话中读其他表。

分析:
由于A会话对mylock表加了读锁,在未解锁前,不能操作其他表。
④在B会话中修改mylock表中的内容。

分析:
出现了阻塞情况,原因:由于A会话对mylock表加锁,在锁未释放时,其他会话是不能对mylock表进行更新操作的。
⑤在A会话中对mylock表进行解锁操作,注意观察B会话中的变化。


分析:
在A会话中对mylock表解锁后,B会话更新操作成功,可看到B会话中的更新操作等待了22分钟。
4.表锁(write)案例
#1.在A会话中对mylock表加写锁。

#2.在A会话中对mylock表进行读写操作。

分析:
由于A会话对mylock表加的写锁,所以读写操作都执行正常。
#3.在A会话中对其他表进行操作。

分析:
在A会话中对其他表进行读写操作都失败,因为A会话中mylock表的写锁并未被释放。
#4.在B会话中对mylock表进行读操作。

分析:
由于mylock表已经加写锁,而写锁为排它锁,因此在B会话中对mylock表进行读操作阻塞。
由于B会话中对mylock的读操作都阻塞,所以其他操作也是阻塞的。
5.表锁定分析
#1.使用如下命令查看是否有表被锁定。
show open tables where In_use>0;
#2.使用如下命令分析表锁。
show status like 'table%';

主要注意两个变量的值:
①Table_locks_immediate:产生表级锁定的次数,表示可立即获取锁的查询次数,每立即获取锁一次该值加1。
②Table_locks_waited:出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待一次锁该值加1),此值高则说明存在较严重的表级锁争用情况。
总结
注意数据库引擎为MyISAM。
①对MyISAM表加读锁,不会阻塞其他进程对同一表(mylock)的读操作,但是会阻塞对同一表的写请求,只有当读锁释放后,才会执行其他进程的写操作。
②在加读锁并未释放锁时,该进程不能对同一表(mylock)进行写操作,并且也不能对其他表进行操作。
③对MyISAM表加写锁,会阻塞其他进程对同一表(mylock)的读和写操作,只有当写锁释放后,才会执行其他进程的写操作。
④在加写锁并未释放锁时,该进程不能对其他表进行操作。
简而言之:读锁会阻塞写,但是不会阻塞读,而写锁会把读和写都阻塞。
此外,MyISAM的读写锁调度是写优先,这也是MyISAM不适合做写为主的表的引擎,因为写锁后,其他线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成长时间阻塞。
by Shawn Chen,2018.6.28日,上午。
相关内容
MySQL高级知识(十三)——表锁的更多相关文章
- MySQL高级知识(十四)——行锁
前言:前面学习了表锁的相关知识,本篇主要介绍行锁的相关知识.行锁偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度小,发生锁冲突的概率低,但并发度高. 0.准备 #1.创建相关测试表tb_ ...
- MySQL高级知识(十六)——小表驱动大表
前言:本来小表驱动大表的知识应该在前面就讲解的,但是由于之前并没有学习数据批量插入,因此将其放在这里.在查询的优化中永远小表驱动大表. 1.为什么要小表驱动大表呢 类似循环嵌套 for(int i=5 ...
- MySQL高级知识系列目录
MySQL高级知识(一)——基础 MySQL高级知识(二)——Join查询 MySQL高级知识(三)——索引 MySQL高级知识(四)——Explain MySQL高级知识(五)——索引分析 MySQ ...
- MySQL高级知识(十五)——主从复制
前言:本章主要讲解MySQL主从复制的操作步骤.由于环境限制,主机使用Windows环境,从机使用用Linux环境.另外MySQL的版本最好一致,笔者采用的MySQL5.7.22版本,具体安装过程请查 ...
- MySQL高级知识(十一)——Show Profile
前言:Show Profile是mysql提供的可以用来分析当前会话中sql语句执行的资源消耗情况的工具,可用于sql调优的测量.默认情况下处于关闭状态,并保存最近15次的运行结果. 1.分析步骤 # ...
- MySQL高级知识(十)——批量插入数据脚本
前言:使用脚本进行大数据量的批量插入,对特定情况下测试数据集的建立非常有用. 0.准备 #1.创建tb_dept_bigdata(部门表). create table tb_dept_bigdata( ...
- MySQL高级知识(八)——ORDER BY优化
前言:在使用order by时,经常出现Using filesort,因此对于此类sql语句需尽力优化,使其尽量使用Using index. 0.准备 #1.创建test表. drop table i ...
- MySQL高级知识(七)——索引面试题分析
前言:该篇随笔通过一些案例,对索引相关的面试题进行分析. 0.准备 #1.创建test表(测试表). drop table if exists test; create table test( id ...
- MySQL高级知识(六)——索引优化
前言:索引优化的目的主要是让索引不失效,本篇通过相关案例对索引优化进行讲解. 0.准备 创建经典的tb_emp表. DROP TABLE IF EXISTS `tb_emp`; CREATE TABL ...
随机推荐
- PHP定界符eof 的使用
PHP是一个Web编程语言,在编程过程中难免会遇到用echo来输出大段的html和javascript脚本的情况,如果用传统的输出方法 ——按字符串输出的话, 肯定要有大量的转义符来对字符串中的引号等 ...
- nginx ssl证书
server { listen ; server_name xxx.com; root "/home/www/website"; ssl on; ssl_certificate / ...
- 24.QTableView函数使用,右击菜单实现
QTableView view(this); QStandardItemModel model(this); /*设置表头水平标题*/ model.setHorizontalHeaderItem(,n ...
- SpringBoot 配置 Servlet、Filter、Listener
SpringBoot 配置 Servlet.Filter.Listener 在SpringBoot应用中,嵌入式的 Servlet 3.0+ 容器不会直接使用 ServletContainerInit ...
- Field 'id' doesn't have a default value错误解决方法
Field 'id' doesn't have a default value 错误提示. 主键类型获取方式为"native"由数据库生成指定. 检查发现数据库中已存在Employ ...
- vim 的:x和:wq
vim是Unix/Linux系统最常用的编辑器之一,在保存文件时,我通常选择":wq",因为最开始学习vim的时候,就只记住了几个常用的命令:也没有细究命令的含义. 但是,最近我在 ...
- OOP设计模式在路上(一)——简单工厂模式
前言 目前以LabVIEW为主要开发工具,熟悉常规开发框架(队列+状态机),个人用得比较多也感觉比较好用和强大的(JKI,AMC),也用它们开发过一些测试平台,但感觉到了一个瓶颈期,想寻求突破,提升L ...
- ecstore Fatal error: Class 'base_request' not found
1.首次安装已存在的ecstore报错: Fatal error: Class 'base_request' not found 报错效果图:(ecstore 乱码需要安装zend guard loa ...
- PHP全路径无限分类原理
全路径无限分类:以一个字段把他所有的父级id按顺序记录下来以此实现的无限分类叫做全路径无限分类 优点:查询方便 缺点:增加,移动分类时数据维护时稍微复杂.
- PHP常用函数归类【持续整理中......】
一.PHP基础语法 变量,常量 严格区分大小写,但内置结构或关键字无所谓(echo) 命名:不能以数字,空格,.来开头,但是可以有汉字,eg:$变量="aa"; ...