MySQL进阶(数据库引擎)——MyISAM和InnoDB引擎的区别

news/2024/12/2 22:51:46/

在这里插入图片描述

1.是否支持行级锁

MyISAM 只有表级锁,而InnoDB 支持行级锁和表级锁,默认为行级锁。

(1)MySQL大致可以归纳为以下3种锁:

  • 表级锁:开销小,加锁快;不会出现死锁;锁的粒度大,发生锁冲突的概率最高,并发度最低。
  • 行级锁:开销大,加锁慢;会出现死锁;锁的粒度小,发生锁冲突的概率最低,并发度最高。
  • 页面锁:开销 和加锁时间界于表锁和行锁之间;会出现死锁,锁定的粒度界于表锁和行锁之间,并发一般。

(2)表锁

MyISAM会在执行select语句前,会自动给涉及的表加读锁,在执行增删改操作前会自动给涉及的表加写锁。

  • MySQL的表锁有两种模式:
    • 表共享读锁
    • 表独占写锁
  • 读锁会阻塞写,写锁会阻塞读和写。
    • 对MyISAM表的读操作,不会阻塞其它进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它线程的写操作。
    • 对MyISAM表的写操作,会阻塞其它进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。

读锁的演示

在这里插入图片描述

窗口1执行

在这里插入图片描述

窗口2的语句被阻塞

在这里插入图片描述

关闭窗口1,窗口2才执行成功

在这里插入图片描述

执行unlock tables释放锁

在这里插入图片描述

释放后才成功

在这里插入图片描述

create table dept(deptno int not null auto_increment,dname varchar(20),loc varchar(20),primary key(deptno)
)ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
# 打开两个会话窗口
# 窗口1执行以下语句
lock table dept read;
select * from dept;
# 窗口2执行执行以下语句
select * from dept;
insert into dept values(null,'财务部','北京');
# 此时,窗口2的请求被阻塞,必须等待会话1释放锁后才能执行;
# 释放会话1的锁,并观察会话2的执行结果。
unlock tables;

写锁的演示

会话1加写锁,会话2读操作,会被阻塞

在这里插入图片描述

会话1 释放锁

在这里插入图片描述

# 会话1加写锁
lock table dept write;
delete from dept where deptno = 1;
# 会话2读操作,会被阻塞
select * from dept;
# 会话1 释放锁
unlock tables;
# 观察会话2 查询结果

注意:如果持有表锁的session异常终止的话(比如说执行了“ctrl+z”),那么该session是不会主动释放锁的,这时候我们可以重启mysql服务器,不推荐。可以通过show processlist 命令来查看线程ID,通过kill 【线程ID】

在这里插入图片描述

总结:MyISAM不适合写表的引擎,写锁后,其它线程不能做任何操作。


http://www.ppmy.cn/news/1174127.html

相关文章

电解电容寿命与哪些因素有关?

电解电容在各类电源及电子产品中是不可替代的元器件,这些电子产品中由于应用环境的原因,使它成为最脆弱的一环,所以,电解电容的寿命也直接影响了电子产品的使用寿命。 一、电解电容失效模式与因素概述 铝电解电容器正极、负极引出…

Golang:反射机制reflect

目录 反射 基本概念 变量的内在机制 Go的反射三定律 反射的使用 空接口与反射 结构体与反射 函数与反射 反射的实际运用场景 反射

gin 框架出现runtime error: index out of range [0] with length 0

之前是这样的: category : c.Request.Form["type"][0] 加上这一句就变成了 fmt.Println(c.Request.FormFile("type")) category : c.Request.Form["type"][0]

Python获取本机IP地址的三种方式

目录 1、使用专用网址 2、使用自带socket库 3、使用第三方netifaces库 1、使用专用网站 获取的是公网IP。 网址:http://myip.ipip.net 代码: import requestsres requests.get(https://myip.ipip.net, timeout5).textprint(res)具体可以类似这样&#x…

【数据仓库-零】数据仓库知识体系 ing

文章目录 一. 数仓基本概念二. 离线数仓建设方法论三. etl流程四. 数仓规范建设指南四. 数据仓库架构五. 数据可视化 通过熟悉构建数仓整体的过程,可以系统的了解 数仓构建理论:能够站在全局角度看数仓的运行架构,数仓执行流程。了解到构建数…

【踩坑】反序列化+引用+全局变量

反序列化引用全局变量 先看一段代码 下面这段代码的初衷是给 config.Cluster字段先赋值一个默认值,然后根据conf 配置【json 字符串】来覆盖config.Cluster字段,如果conf 配置中没有 cluster这个key,config.Cluster就会保持默认值 var def…

代码阅读:LanGCN

toc 1训练 1.1 进度条 import tqdm as tqdm for i, data in tqdm(enumerate(train_loader),disablehvd.rank()):1.2 多进程通信 多线程通信依靠共享内存实现,但是多进程通信就麻烦很多,因此可以采用mpi库,如果是在python中使用&#xff0…