MySQL事务、数据库的存储引擎

1. 事务的概念

 定义:事务就是一组数据库操作序列(包含一个或多个SQL操作命令),事务会把所有操作看作是一个不可分割的整体向数据库系统提交或撤销操作,所有操作要么都执行,要么都不执行。

1.1事务的 ACID

特性:原子性、一致性、隔离性、持久性
原子性:事务管理的基础。把事务中的所有操作看作是一个不可分割的工作单元要么都执行,要么都不执行。
一致性:事务管理的目的。保证事务开始前和事务结束后数据的完整和一致
隔离性:事务管理的手段。使多个事务并发操作同一个表数据时,每个事务都有各自独立的数据空间,事务的执行不会受到其它事务的干扰。可通过设置隔离级别来解决不同的一致性问题。
持久性:事务管理的结果。当事务被提交以后,事务中的命令操作修改的结果会被持久化保存,且不会吧被回滚。

案例:
对银行转帐事务,不管事务成功还是失败,应该保证事务结束后表中A和B的存款总额跟事务执行前一致。

●隔离性:指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。
对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。
修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据。
也就是说并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的。

//当多个客户端并发地访问同一个表时,可能出现下面的一致性问题:
(1)脏读:当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。


(2)不可重复读:指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。(即不能读到相同的数据内容)


(3)幻读:一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,操作前一个事务的用户会发现表中还有一个没有修改的数据行,就好象发生了幻觉一样。


(4)丢失更新:两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。

//事务的隔离级别决定了事务之间可见的级别。
MySQL事务支持如下四种隔离,用以控制事务所做的修改,并将修改通告至其它并发的事务:

 

隔离名称功能作用
未提交读(Read Uncommitted(RU))允许脏读,即允许一个事务可以看到其他事务未提交的修改
提交读(Read Committed(RC))允许一个事务只能看到其他事务已经提交的修改,未提交的修改是不可见的。防止脏读。
可重复读(Repeatable Read(RR))---mysql默认的隔离级别确保如果在一个事务中执行两次相同的SELECT语句,都能得到相同的结果,不管其他事务是否提交这些修改。可以防止脏读和不可重复读。
串行读(Serializable)---相当于锁表
完全串行化的读,将一个事务与其他事务完全地隔离。每次读都需要获得表级共享锁,读写相互都会阻塞。可以防止脏读,不可重复读取和幻读,(事务串行化)会降低数据库的效率。

 mysql默认的事务处理级别是 repeatable read ,Oracle和SQL Server是 read committed 。

 

总结:在事务管理中,原子性是基础,隔离性是手段,一致性是目的,持久性是结果。 

2. 存储引擎

2.1 存储引擎

 

2.2 常用存储引擎

InnoDB、MyISAM
MyISAM:不持支事务和外键约束,占用资源较小,访问速度快,表级锁定,支持全文索引,适用于不需要事务处理,单独写入或查询的应用场景。
InnoDB:支持事务处理、外键约束,缓存能力较好,支持行级锁定,读写并发能力较好,5.5版本后支持全文索引,适用于一致性要求高、数据更新频繁的应用场景。 

 

 

3.MyISAM

3.1 MyISAM 表支持 3 种不同的存储格式:

 

(1)静态(固定长度)表
静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。

(2)动态表
动态表包含可变字段,记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁的更新、删除记录会产生碎片,需要定期执行 OPTIMIZE TABLE 语句或 myisamchk -r 命令来改善性能,并且出现故障的时候恢复相对比较困难。

(3)压缩表
压缩表由 myisamchk 工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。

 

3.2 适用的生产场景

  • 公司业务不需要事务的支持
  • 单方面读取或写入数据比较多的业务
  • MyISAM存储引擎数据读写都比较频繁场景不适合
  • 使用读写并发访问相对较低的业务
  • 数据修改相对较少的业务
  • 对数据业务一致性要求不是非常高的业务
  • 服务器硬件资源相对比较差

 

4. InnoDB

4.1 InnoDB特点

InnoDB:支持事务处理、外键约束,缓存能力较好,支持行级锁定,读写并发能力较好,5.5版本后支持全文索引,适用于一致性要求高、数据更新频繁的应用场景。

 

4.2 适用生产场景分析 

 

企业选择存储引擎依据

5. MyISAM 和 InnoDB 的区别


MyISAM:不支持事务、外键约束;支持全文索引;锁定类型只支持表级锁定;适合单独的查询和插入的操作;读写会相互阻塞;硬件资源占用较小;数据文件和索引文件是分开存储的,存储成三个文件:表结构文件.frm、数据文件.MYD、索引文件.MYI
使用场景:适用于不需要事务支持,单独的查询或插入数据的业务场景

InnoDB:支持事务、外键约束;也支持全文索引;锁定类型支持行级锁定(在全表扫描时仍会表级锁定);读写并发能力较好;缓存能力较好可以减少磁盘IO的压力;数据文件也是索引文件,存储成:表结构文件.frm、表空间文件.ibd
使用场景:适用于需要事务支持,数据一致性要求较高,数据会频繁更新,读写并发高的业务场景

 

6. 命令操作

方法一:
show table status from 库名 where name='表名'\G

方法二:
use 库名;
show create table 表名;

#修改存储引擎
1.通过 alter table 修改
use 库名;
alter table 表名 engine=MyISAM;

查看系统支持的存储引擎

show engines;

 

查看表使用的存储引擎

方法一:
show table status from 库名 where name='表名'\G

方法二:
use 库名;
show create table 表名;

#修改存储引擎
1.通过 alter table 修改
use 库名;
alter table 表名 engine=MyISAM;

use kx;

show table status from kx where name='kx'\G;

 

修改存储引擎

(1) 通过alter table修改

use 库名;
alter table 表名 engine=MyISAM;

(2) 通过修改/etc/my.cnf 配置文件,指定默认存储引擎并重启服务
vim /etc/my.cnf
 

vim /etc/my.cnf
......
[mysqld]
......
default-storage-engine=INNODB

systemctl restart mysql.service

 注意:此方法只对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会有变更。

(3) 通过 create table 创建表时指定存储引擎

use 库名;
create table 表名(字段1 数据类型,...) engine=MyISAM;


//InnoDB行锁与索引的关系
InnoDB行锁是通过给索引项加锁来实现的。

1)
delete from t1 where id=1;	
如果id字段是主键,innodb对于主键索引,会直接锁住整行记录。

2)
delete from t1 where name='aaa';
如果name字段是普通索引,会锁住索引的两行记录。

3)
delete from t1 where age=23;
如果age字段没有索引,会使用全表扫描过滤,这时表上的各行记录都将加上锁。

 7. 死锁

 7.1 死锁定义

所谓死锁:是指两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种互相等待的现象,若无外力作用,事务都将无法继续运行。此时称系统处于死锁状态或系统产生了死锁。

例如,如果事务A锁住了记录1并等待记录2,而事务B锁住了记录2并等待记录1,这样两个事务就发生了死锁现象。计算机系统中,如果系统的资源分配策略不当,更常见的可能是程序员写的程序有错误等,则会导致进程因竞争资源不当而产生死锁的现象

7.2 死锁导致长时间阻塞的危害


众所周知,数据库的连接资源是很珍贵的,如果一个连接因为事务阻塞长时间不释放,那么后面新的请求要执行的sql也会排队等待,越积越多,最终会拖垮整个应用。一旦你的应用部署在微服务体系中而又没有做熔断处理(当某服务出现不可用或响应超时的情况时,会暂时停止对该服务的调用),由于整个链路被阻断,那么就会引发雪崩效应,导致很严重的生产事故。

 

案例:
create table t1(id int primary key, name char(3), age int);
insert into t1 values(1,'aaa',22);
insert into t1 values(2,'bbb',23);
insert into t1 values(3,'aaa',24);
insert into t1 values(4,'bbb',25);
insert into t1 values(5,'ccc',26);
insert into t1 values(6,'zzz',27);

session 1											session 2
begin;											
select * from t1 where id=1 for update;				begin;
													select * from t1 where id=2 for update;
select * from t1 where id=2 for update;#等待		
													select * from t1 where id=1 for update;#死锁发生

7.3 如何避免死锁

1)设置事务的锁等待超时时间 innodb_lock_wait_timeout
2)设置开启死锁检测功能 innodb_deadlock_detect
3)为表建立合理的索引,减少表锁发生的概率
4)如果业务允许,可以降低隔离级别,比如选用 提交读 Read Committed 隔离级别,从而避免间隙锁导致死锁
5)建议开发人员尽量使用更合理的业务逻辑,比如多表操作时以固定顺序访问表,尽量避免同时锁定多个资源
6)建议开发人员尽量保持事务简短,减少对资源的占用时间和占用范围
7)建议开发人员在读多写少的场景下采用乐观锁机制 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/721180.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式学习记录6.13(qt day1)

一.思维导图 二.练习(简单模拟tim界面) 2.1代码 mywidget.cpp #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {this->setWindowTitle("Tim");this->setWindowIcon(QIcon("C:\\Users\\zy\…

Vue61-消息订阅与发布-任意组件之间的通信

一、原理图 原生的JS不能实现订阅与发布,要借助第三方库:pubsub-js(任何一个框架都能用!) 二、案例实现 school组件,需要数据(订阅消息),student组件提供数据&#xff0…

现代互联网应用中的HTTPS技术

现代互联网应用中的HTTPS技术 在现代互联网应用中,网上诈骗、垃圾邮件和数据泄露等现象时有发生。为了保障数据安全,我们通常选择采用HTTPS技术。甚至在iOS开发中,调用接口必须是HTTPS接口。现在,部分浏览器也开始强制要求网站必…

这个开源软件,送给爱读书的你!!【送源码】

对于喜欢阅读的人来说,一定经历过从一本厚厚的修仙书籍到MP3、MP4的阅读时代,再到现今的手机软件。 但是现在的阅读软件经常会遇见以下问题:比如广告弹窗太多,排版乱,甚至很多的APP都进入会员时代,再加上一…

【RK3588/算能/Nvidia智能盒子】挑战「无电无网」部署AI算法,守护大亚湾荃美石化码头工地安全

“万顷碧波之上,一座千米钢栈桥如蛟龙出水,向大海蜿蜒。钢栈桥上的项目建设者正在加紧作业,为助推惠州大亚湾加快建设成为世界级绿色石化基地全力奋战。”这是不久前北京日报对大亚湾惠州港荃湾港区荃美石化码头工地的描述。 △ 图片来源于北…

C#——文件读取FileStream类详情

文件读取FileStream类 一个文件进行读写的时候,会变成一个文件流 FileStream类输入流 用于从文件进行读取文件。输出流,向文件写入的操作 FilleStream用于文件当中任何位置的读写 此文章借鉴与:C#教程(非常详细) Fil…

基于minhook的Windows HOOK

MinHook是一个基于微软Detours技术的可移植Hook库,它允许开发者在运行时更改函数定义,而无需修改原始函数代码。以下是关于MinHook的详细介绍: 基本概念 定义:MinHook使用内存污染和跳转技术来实现Hook,使得开发者能…

2024 年值得关注的 9 个最佳开源大语言模型

一、简述 开源模型在提供创新方面发挥着至关重要的作用,同时为开发人员、爱好者和开发人员提供了深入研究其复杂之处并对其进行微调以执行特定任务的机会。 我们将探讨一些正在开拓新市场前景并带来其独特能力和优势的顶级开源 LLM。 二、开源模型清单 1.GPT-NeoX…

【AICFD教程】汽车外气动仿真,小白学CFD的入门案例

【视频教程】 【教程】汽车外气动仿真,小白学CFD的入门案例 【文字教程】 1. 案例背景 1.1 学习目标 本案例针对某汽车仿真模型,在车速为40m/s时进行了汽车外流场的数值模拟。 本案例教程旨在演示AICFD中以下场景与功能的操作: a. 单域外…

【Linux Vim的保姆级教程】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

统计学一(术语,正态)

目录 一,常用术语 二,正态分布(Normal Distribution) 三,中心极限定理(Central Limit Theorem) 一,常用术语 population(族群):要统计的总的 populationSize(族群数量):要统计的总…

CleanMyMac X for Mac系统优化垃圾清理软件卸载 工具(小白轻松上手,简单易学)

Mac分享吧 文章目录 效果一、准备工作二、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、启动台显示软件图标,表示安装成功 三、运行测试1、打开软件,配置2、授权,允许完全磁盘访问 安装完成&a…

【Spring Cloud应用框架】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

东莞酷得:电子玩具嵌入式方案商

东莞市酷得智能科技有限公司,作为一家专业的玩具底层方案服务商,与国内外多家优秀制造企业有着深度合作,始终坚持以孩子为中心,以创新为动力,为孩子们打造独具特色的玩具产品。公司拥有一支专业的设计团队,…

南阳理工学院(期末)算法分析练习题

一、算法阅读分析题: 1.分析如下算法,回答问题(10分)。 该算法的作用是什么(2分)?分析该算法的时间复杂度(5分)?设计算法的一个输入,并给出对应的算法输出结果(3分) (1)该算法的作…

【记录46】【案例】echarts 柱状图

echarts环境4.1.0 <template><div id"threefour"></div> </template> <script> import * as echarts from "echarts" export default {name:"",components:{},data(){return {}},methods:{getdata(){var myChart…

超分辨率重建——2022冠军RLFN网络推理测试(详细图文教程)

&#x1f4aa; 专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &#x1f4dd;《暗光增强》 &a…

润滑不良:滚珠花键磨损的隐形杀手!

滚珠花键作为一种精密机械传动元件&#xff0c;被广泛应用于各种机器和设备中&#xff0c;起着传递动力和运动的重要作用。滚珠花键经过长时间的运行&#xff0c;难免会多少些磨损&#xff0c;严重的话还会导致设备不能正常运转。那么&#xff0c;如何保证它的正常运行呢&#…

开展“安全生产月”活动向媒体投稿的好方法找到了

作为一名单位的信息宣传员,我的职责是确保每一次重要活动的声音都能准确无误地传达到社会的每一个角落。在这样的使命驱动下,我曾一度陷入了一种传统的投稿模式——依赖电子邮件,将精心准备的稿件一封封地发送给各大媒体。初入此行,我满心以为这便是信息传播的路径,却未料到,这…

uniapp条件编辑语法

uniapp中的“条件编译”&#xff1a;#ifdef详细解释_uniapp #ifdef-CSDN博客 uniapp 多端兼容 #ifdef #ifndef #endif 和 平台标识 - 简书