MySQL的事务深入理解和存储系统

news2024/9/29 4:04:18

目录

一、事务的基本理论

1.事务的隔离

1.1事务之间的相互影响

1.2事物隔离级别

2.查询和设置事物隔离级别

2.1查询全局事务隔离级别

2.2查询会话事物隔离级别

2.3设置全局事务隔离级别

2.4设置会话事务隔离级别

​编辑3.事务控制语句

​编辑3.1提交事务

​编辑3.2回滚事务

3.3多点回滚

3.4设置控制事务

二、MySQL存储引擎

1.存储引擎的种类

2.InnoDB存储引擎

3.MylSAM存储引擎

1.特点

2.文件存储格式

4.修改存储引擎

4.1修改已存在的表

4.2建表时指定引擎

4.3修改配置文件


一、事务的基本理论

1.事务的隔离

在数据库中,多个事务同时执行时,它们之间可能存在相互影响。事务的隔离性通过事务隔离级别来控制,不同的隔离级别对事务间的影响有不同的管理策略。

1.1事务之间的相互影响

脏读(Dirty Read): 在较低的隔离级别(如读未提交Read Uncommitted)下,一个事务可以读取到另一个事务尚未提交的数据,如果这个事务随后被回滚,那么读取的数据就是无效的。

不可重复读(Non-repeatable Read): 即在一个事务中,对同一行数据进行两次读取时,结果不一致,因为在这两次读取之间,另一个事务可能对此行数据进行了修改并提交了事务。

幻读(Phantom Read): 在可重复读(Repeatable Read)隔离级别下,同一个事务在执行相同的查询时,两次查询结果集中包含了不同的行(新增的行像幽灵一样突然出现),这是因为另一个事务在这两次查询期间插入了新的行并提交了事务。

丢失更新(Lost Update): 当两个事务同时修改同一行数据且都未进行锁操作时,可能会导致其中一个事务的更新丢失。例如,两个事务先后将某行的值从A更新为B和C,最终的结果可能是A直接变为C,B的更新被忽略。

不可重复读:指的是在同一个事务内,同一个查询在不同时刻读取到了不同的数据。比如事务A在开始时读取了一行数据,但是在事务A还未结束时,事务B修改了这行数据并提交了事务。当事务A再次读取同一行数据时,发现数据内容与之前读取的结果不同,这就发生了不可重复读。

幻读:则是在同一个事务内,同一个查询在不同时刻读取到了不同的行数。同样是事务A在开始时执行了一个范围查询(如:查询年龄大于20岁的人数),并在结果集基础上进行了操作。之后事务B插入了一些新的满足条件(年龄大于20岁)的数据并提交了事务。当事务A再次执行同样的范围查询时,发现结果集中出现了新的行(即“幽灵行”),尽管它先前读取过的数据行并未发生变化,但行数增加了,这就是幻读现象。

1.2事物隔离级别

为了解决这些问题,数据库系统提供了不同的事务隔离级别:

读未提交(Read Uncommitted):最低隔离级别,允许脏读、不可重复读和幻读。

读已提交(Read Committed):解决了脏读问题,但仍可能出现不可重复读和幻读。

可重复读(Repeatable Read):MySQL默认的隔离级别,解决了脏读和不可重复读问题,但幻读仍有可能发生(在MySQL中通过Next-Key Locks解决一部分幻读问题)。

串行化(Serializable):最高隔离级别,可以避免所有并发问题,但可能会导致性能下降,因为它几乎等同于事务串行执行。在串行化级别下,事务冲突会被严格禁止,以确保事务间不会互相影响。

事务隔离级别的作用范围分为两种

全局级:对所有的会话有效

会话级:只对当前的会话有效

2.查询和设置事物隔离级别

2.1查询全局事务隔离级别

show global variables like '%isolation%';

mysql> show global variables like '%isolation%';

select @@global.tx_isolation;

mysql> select @@global.tx_isolation;

transaction_isolation 和 tx_isolation 展示的是当前服务器的全局事务隔离级别

2.2查询会话事物隔离级别

show session variables like '%isolation%';

mysql> show session variables like '%isolation%';

select @@session.tx_isolation; 

mysql> select @@session.tx_isolation; 

在进行会话事务,即交互时的隔离级别同样为repeatable read,即可重复读

2.3设置全局事务隔离级别

set global transaction isolation level 事务隔离级别;

设置全局默认事务隔离级别为read committed

set global transaction isolation level read committed;

2.4设置会话事务隔离级别

set session transaction isolation level 事务隔离级别;

设置会话事务为read committed

set session transaction isolation level read committed;

3.事务控制语句

首先准备工作创建名为kgc_school的数据库,并在kgc_school下创建名为ky35的数据表

插入数据


3.1提交事务

使用begin开始事务,而后开始处理、修改数据,最后使用commit提交事务,算一次完整的事务,则在事务中的所有操作生效,否则不生效。

首先begin开始事务

给'xuzhou'的money减少100

最后commit提交事务

3.2回滚事务

使用rollback指令回滚未提交的事务,使数据回到事务开始前的状态

可知'xuzhou'的money是900

开启事务并修改

使用rollback进行回滚

3.3多点回滚

开始事务后,使用savepoint s1 进行节点标记,而后使用 rollback to savepoint 节点名称进行回滚

第一次修改的值为800,并设置事务节点为s1

再次修改,此时'xuzhou'的money数值为700,并设置事务节点为s2

进行回滚并回到s1

此操作不可逆,如果回滚到s1之后,不能回到之后的节点,只能往前

3.4设置控制事务

使用set指令设置控制事务

修改控制事务autocommit的值为off

如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback|commit;当前事务才算结束,当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。

 如果开起了自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit。

二、MySQL存储引擎

在MySQL数据库的世界里,存储引擎作为数据库的核心组件,负责数据的存储、检索和索引管理等关键任务。MySQL支持多种存储引擎,每种引擎都有其独特的优劣和适用场景,使得MySQL能够灵活适应各种各样的业务需求。


1.存储引擎的种类

使用show engines;指令查当前mysql支持哪些存储引擎

字段含义

Engine存储引擎
Support系统是否支持
Comment注释信息
Transactions是否支持事务
XA是否支持XA协议
Savepoints

是否支持节点

2.InnoDB存储引擎

InnoDB是MySQL的默认存储引擎。InnoDB引擎支持行级锁定,能够有效减少并发操作时的锁争用,提高并发性能。同时,它实现了ACID(原子性、一致性、隔离性、持久性)事务特性,确保了数据的一致性和安全性。此外,InnoDB引擎支持外键约束,提供了良好的数据完整性保障。在现代MySQL版本中,InnoDB还支持分区表、聚集索引和自适应哈希索引等特性,进一步优化了性能。

MRG_MyISAM存储引擎

基于MERGE,将多个MyISAM表合并成一个逻辑表。相同MyISAM表的集合

MEMORY存储引擎

MEMORY(以前称为 HEAP)存储引擎将数据存储在内存中,因此它的查询速度极快,尤其适用于临时表或者需要快速读写的场景。但由于数据仅存在于内存中,一旦MySQL服务器关闭,表中的数据就会丢失。此外,MEMORY引擎也不支持事务和外键约束。

BLACKHOLE黑洞引擎

所有写入都被丢弃,用于记录binlog但不实际存储数据

MyISAM存储引擎

MyISAM曾是MySQL早期的默认存储引擎,虽然在事务处理和行级锁定方面不如InnoDB强大,但因其索引文件和数据文件分离、全表扫描速度快等特点,在读密集型场景中表现出色。MyISAM不支持事务和外键,基于哈希,存储在内存中,对临时表很有用

ARCHIVE存储引擎

ARCHIVE存储引擎主要用于大量历史数据归档,它压缩率极高,适合长期存储且很少需要更新的大容量静态数据。ARCHIVE引擎只支持INSERT和SELECT操作,不支持UPDATE和DELETE,也不支持索引。

CSV存储引擎

以CSV格式存储数据,易于与其他程序交换数据

目前MySQL常用的存储引擎有InnoDB存储引擎与MyISAM存储引擎

2.lnnoDB存储引擎

MySQL从5.5之后版本开始,默认的存储引擎为 InnoDB

在建表时,不需要指定,默认就是此类

DML操作遵循ACID模型,支持事务;

行级锁,如果事务A正在操作某行,其它事务不能操作此行,可以操作此表的其他行,提高并发访问性能;

支持外键 FOREIGN KEY约束,保证数据的完整性和正确性

3.MylSAM存储引擎

1.特点

不支持事务,不支持外键

支持表锁,操作或者修改一张表的数据时,整张表会被锁起来,不允许其他用户操作,等到操作结束退出后释放,不支持行锁

访问速度快,对事物的完整性没有要求

2.文件存储格式

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

静态表(Fixed-length Table)

在MySQL的MyISAM存储引擎中,静态表也称为固定长度表。这类表中的每一行数据占用的空间是固定的,即所有列的长度总和。例如,如果一个列定义为CHAR(10),无论实际存储的内容长短,都将占用10个字符的固定空间。静态表的优点在于查询速度快,因为行数据是连续存储且大小恒定,易于缓存和快速定位。缺点是如果数据长度小于定义长度时,会浪费存储空间。

动态表(Variable-length Table)

动态表(也称变长表)中的行长度是可以变化的。例如,在VARCHAR类型的列中,实际存储的数据长度与列定义的最大长度有关。动态表能够更有效地利用存储空间,尤其是对于包含大量可变长度数据的列时。但这也可能导致数据在硬盘上的存储位置不连续,影响到某些查询操作的性能。
压缩表(Compressed Table):

压缩表

是对已有表的数据进行压缩存储,以节省磁盘空间。在MySQL中,可以使用MyISAM的myisampack工具对MyISAM表进行压缩,创建出来的表为只读表。InnoDB存储引擎也支持表压缩,通过设置相应的表选项可以在表级别进行压缩,这样既能节省存储空间,又能保持表的读写能力。压缩表在读取时需要解压,这会增加CPU的消耗,但在I/O密集型环境中,由于减少了磁盘读写,总体上可能提高性能。

MyISAM在磁盘上存储成三个文件,文件名和表名都相同,但是扩展名分别为:

文件存储表结构的定义的扩展名:.frm

数据文件的扩展名为 .MYD

索引文件的扩展名是 .MYI

4.修改存储引擎

4.1修改已存在的表

查看已存在的表

alter table 表名 engine = 存储引擎种类;

mysql> alter table ky35 engine =myisam;

查看

4.2建表时指定引擎

create table 表名 (字段1 字段1类型[comment 注释信息],字段2 字段2类型) engine = 存储引擎种类

mysql> create table myi(id int(4),name varchar(10),age char(3))engine=myisam;

查看

4.3修改配置文件

在/etc/my.cnf文件加添加指定信息,来确定建表时的默认存储引擎类型

修改后重新启动文件

创建文件

查看

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSP-S 真题:格雷码

原文链接:CSP-S 真题第二讲:格雷码 说明:CSDN和公众号文章同步发布,需要第一时间收到最新内容,请关注公众号【比特正传】。 一、题目背景 题目来源:CSP-S 2019年 T1 题目考察点:递归、搜索 …

【每周赠书活动第1期】Python编程 从入门到实践 第3版(图灵出品)

编辑推荐 适读人群 :本书适合对Python感兴趣的所有读者阅读。 编程入门就选蟒蛇书! 【经典】Python入门经典,常居Amazon等编程类图书TOP榜 【畅销】热销全球,以12个语种发行,影响超过 250 万读者 【口碑】好评如潮…

【Linux Day16 I/O复用】

I/O复用 用途:I/O 复用能同时监听多个文件描述符。 I/O 复用虽然能同时监听多个文件描述符,但它本身是阻塞的。并且当多个文件描述符同时就绪时,如果不采取额外的措施,程序就只能按顺序依处理其中的每一个文件描述符,…

鸿蒙实战开发-使用关系型数据库实现对账单的增、删、改、查

介绍 本Codelab以记账为例,使用关系型数据库的相关接口实现了对账单的增、删、改、查操作。实现效果如图所示: 相关概念 关系型数据库:基于关系模型来管理数据的数据库,提供了增、删、改、查等接口,也可运行输入的SQ…

简述C语言文件操作

🌈 个人主页:白子寰 🔥 分类专栏:魔法指针,进阶C,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~ 💡 坚持创作博文(平均质量分79),分享…

java-基于springboot+vue实现的旅游信息管理系统功能介绍

开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog 项目关键技术 1、JSP技术 JSP(Java…

深入探索JDK动态代理:从入门到原理的全面解析

文章目录 基本概念入门案例实现JDK动态代理的步骤入门实操拓展--动态生成代理类的几种方法方式一:通过getProxyClass方法获取代理实例方式二:通过newProxyInstance方法获取代理实例(常用!)方式三:通过Lambd…

二十三 超级数据查看器 讲解稿 设置

二十三 超级数据查看器 讲解稿 设置 ​点击此处 以新页面 打开B站 播放当前教学视频 点击访问app下载页面 百度手机助手 下载地址 大家好,这节课我们讲一下,超级数据查看器的设置功能。 首先,我们打开超级数据查看器, 我…

AcWing 796. 子矩阵的和

这个题的重点是仿照一维的数组,所以a[N][N]也是从1索引开始的。画个图举个例子就非常清晰了 之所以不好理解是因为没画格子,一个格子代表一个点,就很好理解了。 java代码: import java.io.*; public class Main{static int N 1…

Java二阶知识点总结(七)SVN和Git

SVN 1、SVN和Git的区别 SVN是集中式的,也就是会有一个服务器保存所有代码,拉取代码的时候只能从这个服务器上拉取;Git是分布式的,也就是说每个人都保存有所有代码,如果要获取代码,可以从其他人手上获取SV…

使用 STL 容器发生异常的常见原因分析与总结

目录 1、概述 2、使用STL列表中的元素越界 3、遍历STL列表删除元素时对迭代器自加处理有问题引发越界 4、更隐蔽的遍历STL列表删除元素时引发越界的场景 5、多线程同时操作STL列表时没有加锁导致冲突 6、对包含STL列表对象的结构体进行memset操作导致STL列表对象内存出异…

操作符的属性:优先级、结合性

操作符的属性:优先级、结合性 优先级结合性 C语言的操作符有2个重要的属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序。 优先级 优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执行。各…

RabbitMQ3.x之一_WindowServer2019中安装RabbitMQ详细教程

RabbitMQ3.x之一_WindowServer2019中安装RabbitMQ详细教程 文章目录 RabbitMQ3.x之一_WindowServer2019中安装RabbitMQ详细教程1. 安装环境说明1. WindowServer20192. ErLang与RabbitMQ对应版本 2 安装Erlang1. 安装Erlang2. ErLnag环境变量配置3. 查看是否安装成功 3. 安装Rab…

数据结构面试常见问题之串的模式匹配(KMP算法)系列-大师改进

😀前言 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法) KMP算法的优势: 提高了匹配效率,时间复杂度为O(m…

【C++】用哈希桶模拟实现unordered_set和unordered_map

目录 一、哈希介绍1.1 哈希概念1.2 哈希冲突解决1.2.1 闭散列1.2.2 开散列 二、哈希桶2.1 实现哈希桶2.1.1 构造节点和声明成员变量2.1.2 构造与析构2.1.3 仿函数2.1.4 查找2.1.5 插入2.1.6 删除 2.2 kv模型哈希桶源代码 三、改造哈希桶3.1 beginend3.2 迭代器3.2.1 前置 3.3 改…

Linux_ubuntu中进行断点调试

文章目录 一、安装gdb调试器:二、使用gcc编译程序:三、使用gdb对程序进行调试:1.设置断点:使用break命令或简写为b来设置断点2.调试运行——run:3.继续执行——continue/c:4.单步执行:5.监视变量…

6.windows ubuntu 子系统 测序数据质量控制。

上一个分享,我们对测序数据进行了质量评估,接下来我们需要对数据进行数据质量控制。 数据预处理(Data Preprocessing):包括去除接头序列(adapter trimming)、去除低质量序列(qualit…

【Spring Boot 源码学习】共享 MetadataReaderFactory 上下文初始化器

《Spring Boot 源码学习系列》 共享 MetadataReaderFactory 上下文初始化器 一、引言二、往期内容三、主要内容3.1 源码初识3.2 CachingMetadataReaderFactoryPostProcessor3.2.1 register 方法3.2.1 configureConfigurationClassPostProcessor 方法 3.3 ConfigurationClassPos…

SpringMVC结合设计模式:解决MyBatisPlus传递嵌套JSON数据的难题

🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 &a…

Learn OpenGL 24 点光源阴影

点光源阴影 上个教程我们学到了如何使用阴影映射技术创建动态阴影。效果不错,但它只适合定向光,因为阴影只是在单一定向光源下生成的。所以它也叫定向阴影映射,深度(阴影)贴图生成自定向光的视角。 本节我们的焦点是…