MySQL数据库事务和存储引擎

news2024/9/28 21:29:09

MySQL数据库事务和存储引擎

  • 一、mysql事务
    • 1、事务的概念
    • 2、事务的ACID特点
      • 2.1 原子性
      • 2.2 一致性
      • 2.3 隔离性
      • 2.4 持久性
    • 3、两个事务之间的影响
      • 3.1 脏读(读取未提交数据)
      • 3.2 不可重复度(前后多次读取,数据内容不一致)
      • 3.3 幻读(前后多次读取,数据总量不一致)
      • 3.4 丢失更新
    • 4、mysql事务隔离级别
      • 4.1 查询全局事务的隔离级别
      • 4.2 查询会话事务隔离级别
      • 4.3 设置全局事务隔离级别
      • 4.4 设置会话事务隔离级别
    • 5、数据控制语句(案例)
      • 5.1 测试提交事务
      • 5.2 测试回滚事务
      • 5.3 测试多回滚
      • 5.4 使用set设置控制事务
  • 二、mysql存储引擎
    • 1、存储引擎的概念
    • 2、MyISAM引擎介绍
      • 2.1 myisam引擎的特点
      • 2.2 myisam支持3中不同的存储格式
      • 2.3 myisam使用的生产场景
    • 3、InnoDB存储引擎
      • 3.1 InnoDB特点
      • 3.2 死锁(重点)
    • 4、查看系统支持的存储引擎
    • 5、查看表的使用的存储引擎
    • 6、修改报表的存储引擎
      • 6.1 修改表的存储引擎
      • 6.2 修改后续创建的表的存储引擎
      • 6.3 直接指定存储引擎创建表

一、mysql事务

1、事务的概念

  • 是一种机制,一个操作序列,包含一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。

  • 是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。

  • 使用于多用户同时操作的数据库系统的场景,如:银行、保险公司整卷交易系统等等。

  • 事务是通过事务的整体性以保证数据的一致性.

总结:所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

2、事务的ACID特点

ACID:是指在可靠数据库管理系统(DBMS)中,事务(transaction)应该具有四个特性:原子性、一致性、隔离型、持久性。这是可靠数据库所具备的几个特性

2.1 原子性

原子性:指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生

  • 事务是一个完整的操作,事务的各元素是不可以分的
  • 事务中的所有元素必须作为一个整体提交或回滚
  • 如果事务中的任何元素失败,则整个事务将失败
以begin为开始,以commit为结束,这里面的语句有原子性,要么都发生,要么都不发生。

例如:被begin和commit括起来的几条语句,如果其中有一条语句报错,那么整条语句都不会执行。只有全部执行了,括起来的语句才会生效。这就是原子性。

2.2 一致性

一致性:指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏

  • 当事务完成时,数据必须处于一致状态

  • 在事务开始前,数据库中存储的数据处于一致状态

  • 在正在进行的事务中,数据可能处于不一致的状态。

  • 当事务成功完成时,数据必须再次回到已知的一致状态。

就是在我们执行事务前和事务后,修改的数据库内容需要保存到磁盘中。展现给我们看的内容和存储在磁盘的内容需要一致。

2.3 隔离性

隔离性:指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。

  • 对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,他不应以任何方式依赖或影响其他事务。
  • 修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据。
当同一个数据库中的两个表被两个不同事务修改同一条记录时,两条事务是相对独立的。不会相互干预对方的执行后果,只有先后的顺序来决定最后的数据内容。(数据在修改时,是串行的,必须得一个事务一个事务的执行)

2.4 持久性

持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

  • 值不管系统是否发生故障,事务处理的结构都是永生的。
  • 一旦事务被提交,事务的效果会被永久的保留在数据库中。
当事务执行完成之后,事务所修改的数据,将会永久保存在磁盘当中。且无法进行撤销和回滚。除非没有commit提交,可以进行修改。

3、两个事务之间的影响

3.1 脏读(读取未提交数据)

  • 脏读是读到了别的事务回滚前的脏数据。

  • 比如事务B执行过程中修改了数据x,在未提交前,事务A读取了数据x,而事务B却回滚了,这样事务A就形成了脏数读。

  • 也就是说,当前事务读到的数据是别的事务想要修改的,但是没有修改成功的数据。

3.2 不可重复度(前后多次读取,数据内容不一致)

  • 一个事务内两个相同的查询却返回了不同数据。这是由于查询时系统中其它事务修改的提交而引起的,事务A第一次查询得到的一行记录为row1,事务B提交修改后,事务A第二次查询得到row1,但是内容发生了变化。

3.3 幻读(前后多次读取,数据总量不一致)

  • 一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行,同时,另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据,那么操作前一个事务的用户会发现表中还没有修改的数据行,就好像发生了幻觉一样。
两个事务对同一个数据进行操作,一个删除了,一个又插入了,那么删除的事务就会觉得产生了幻觉一样。

3.4 丢失更新

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

4、mysql事务隔离级别

隔离级别解决的问题:解决的是执行并发事务之后,数据不一致的问题

  • read uncommited : 读取尚未提交的数据:不可解决藏脏读。

  • read committed : 读取已经提交的数据:可以解决脏读。

  • **repeatanle read : ** 重读读取,可以解决脏读和不可重复读, (mysql默认的)

  • serializable : 串行化:可以解决脏读,不可重复读和幻读, (相当于锁表)

4.1 查询全局事务的隔离级别

show global variables like '%isolation%'

select @@global.tx_isolation;

#两种查询全局事务的隔离级别

6725

4.2 查询会话事务隔离级别

show session variables like '%isolation%';
select @@session.tx_isolation;
select @@tx_isolation;

#三种查询会话事务的隔离级别

6726

4.3 设置全局事务隔离级别

set global transaction isolation level serializable;
#将全局事务隔离级别设置成串行化

show global variables like '%isolation%';
#查询全局事务的隔离级别

6727

4.4 设置会话事务隔离级别

set session transaction isolation level read committed;
#修改会话事务隔离级别为读取已提交的数据
select @@tx_isolation;
#查看会话事务隔离级别

6728

5、数据控制语句(案例)

BEGIN 或 START TRANSACTION: 手动开启一个事务
COMMIT 或 COMMIT WORK: 提交事务,并使已对数据库进行的所有修改变为永久性的。

ROLLBACK 或 ROLLBACK WORK: 执行回滚,而回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。

SAVEPOINT S1 : 使用 SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多SAVEPOINT;“S1”代表回滚点名称。

ROLLBACK TO [SAVEPOINT] S1 : 把事务回滚到标记点。

5.1 测试提交事务

begin;
update ky28 set age=age + 100 where id=1;
select * from ky28;
commit;

6729

6730

5.2 测试回滚事务

begin;
update ky28 set age=age - 10 where id=2;
select * from ky28;
 
rollback;

6731

5.3 测试多回滚

加入创建了两个回滚,s1和s2,s1先创建,s2创建,当我们最后恢复的时候,如果恢复到s1节点,那么就无法切换到s2节点,如果恢复到s2节点,那么可以切换到s1节点。

begin;
update ky28 set score=score + 50 where id=3;
select * from ky28;
savepoint s1;    #创建一个回滚点
 
update ky20 set age=age + 5 where id=3;
select * from ky28;
savepoint s2;    #创建第二个会回滚点

rollback to s1;    #恢复到第一个回滚点
select * from lcdb2;

5.4 使用set设置控制事务

在mysql中,当我们输入命令时,是系统在自动帮我创建事务(begin和commit),无需我们手动输入,这是因为mysql数据库默认设置了自动提交。

show variables like 'autocommit';
#查看mysql中是否自动提交索引

set autocommit=0;
#禁止自动提交

set autocommit=1;
#开启自动提交

6732

6733

6734

二、mysql存储引擎

1、存储引擎的概念

1、mysql中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制,索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在mysql中称为存储引擎。

2、存储引擎是mysql将数据存储在文件系统中存储方式或存储格式。

3、目的:为了适应各种应用场景

  • 场景一:mysql数据库中的数据,经常执行读取操作。
  • 场景二:mysql数据库中的数据,经常除执行写入的操作。
  • 场景三:mysql数据库中的数据,经常会被查询—》承受着并发读、写的压力

4、mysql常用的存储引擎

  • MyISAM
  • InnoDB

5、mysql数据库中的组件,负责执行实际的数据I/O操作

6、mysql系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储。

2、MyISAM引擎介绍

2.1 myisam引擎的特点

①myisam不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的。

②myisam特性: 访问速度快,对事务完整性没有要求

  • myisam适合查询、插入为主的应用场景

③myisam在磁盘上存储成三个文件,文件名和表名都相同,但是扩展名不同

  • .frm 文件存储表结构的定义
  • 数据文件的扩展名为:.MYD(mydata)
  • 索引文件的扩展名为:.MYI(myindex)

④表级锁定形式,数据在更新时,会锁定整个表

  • 数据库在读写过程中相互阻塞: --》串行操作,按照顺序操作,每次在读或写的时候会把权表锁起来

  • 会在数据写入的过程中阻塞用户数据的读取

  • 也会在数据读取的过程中阻塞用户的数据的写入

  • 特性:数据单独写入或读取,速度过程较快且占用资源相对少。

⑥myisam是表级锁定,读或写无法同时进行

  • 好处是: 分开执行,速度快,资源暂用相对较少

2.2 myisam支持3中不同的存储格式

①静态(固定长度)表

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

②动态表

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

③压缩表

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

2.3 myisam使用的生产场景

  • 公司业务不需要/不注重事务的ACID支持

  • 单方面读取或写入数据比较多的业务

  • myisam存储引擎数据读写都比较频繁的场景不适合(读写均并发的场景不适合)

  • 使用读写并发访问相对较低的业务

  • 数据修改相对较少的业务

  • 对数据业务一致性要求不是非常高的业务(因为myisam不支持事务)

  • 服务器硬件资源相对比较差

总结:使用于单方向的任务场景,同时并发量不高,对于事务要求不高的场景

3、InnoDB存储引擎

3.1 InnoDB特点

①支持事务(遵守ACID特性),支持4个事务隔离级别(数据不一致)

  • mysql从5.5版本开始,默认的存储引擎为innodb。

②读写阻塞与事务隔离级别相关

  • 能非常高效的缓存索引和数据
  • 表与主键以簇的方式存储
  • 支持分区、表空间,类似oracle数据库
  • 支持外键约束,5.6前不支持全文索引,5.6后支持

③对硬件资源要求比较高

  • 行级锁定,但是全表扫描任然会表级锁定。如select * from 表名。

④InnoDB中不保存的行数

如 select count() from table; 时,InnoDB 需要扫描一遍整个表来计 算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。需要注意的是,当 count()语句包含 where 条件时 MyISAM 也需要扫描整个表。对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM 表中可以和其他字段一起建立组合索引。

清空整个表时,innodb是一行一行的删除,效率非常慢,myisam则会重建表

3.2 死锁(重点)

MyISAM:表级锁定

Innodb:行级锁定

①死锁的产生

  • 高并发的情况容易产生死锁。

当两个事务分别访问/读取2行记录,同时又需要读取对方的记录数据,因为(行锁的限制)而造成了阻寨的现象

②解决死锁

第一种解决方案: 查询线程信息,直接杀死线程,直接kill id就可以。

查询线程信息sql语句是什么? show processlist;

第二种解决方案: 等待,可以调整数据的资源,给予mysql更多的内存资源,线程资源,让产生死锁的线程能够冲破释放锁。

③预防死锁

  • 给予相对充裕的mysql数据库的资源
  • 调整更为精确的查找方案
  • 定义更为合理的存储过程

4、查看系统支持的存储引擎

show engines;

6735

5、查看表的使用的存储引擎

show table status from ky where name='info'\G

或
show create table ky.ky28;

6736

6、修改报表的存储引擎

6.1 修改表的存储引擎

alter table ky.ky28 engine=myisam;
#修改表的存储引擎

6737

6.2 修改后续创建的表的存储引擎

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

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

6738

6739

6.3 直接指定存储引擎创建表

create table ydq(id int(4),name varchar(10)) engine=myisam;
#创建表的时候指定存储引擎

6740

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

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

相关文章

【Vue+Django】Training Management Platform分页功能 - 20230621

需求描述 分页显示数据,避免造成服务器宕机。 Django:根据pageNum返回数据切片 Views.py写入业务逻辑 # 数据接口:暴露trs_training_and_test_record数据 def api_trs_training_and_test_record(request,myDateS,myDateE,mySystem,catego…

SpringCloud Alibaba入门4之nacos注册中心管理

我们在上一章的基础上进行学习。https://blog.csdn.net/qinxun2008081/article/details/131330451 什么是注册中心?它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址&…

Java开发必看,Spring增强性能与现代应用支持

出品 | CSDN 云计算 开发界经典话题之一,就是语言之争。除了每月的开发语言排行榜上几大王牌语言在榜单前列上上下下,在 CSDN 连续几年的年度开发者调研《中国开发者调查报告》中,Java 一直被评为开发者使用占比最高的语言,而 Spr…

银河麒麟V10 wireguard 编译

系统信息 操作系统信息: 我这里使用的操作系统是 银河麒麟V10,CPU为飞腾 ARM64 根据wireguard 的编译指南:https://www.wireguard.com/compilation/ 安装 编译安装内核 注意:5.6 以上内核不需要编译安装,已经集…

【数据库五】MySQL高级SQL语句

MySQL高级SQL语句 1.MySQL进阶查询1.1 select1.2 distinct1.3 where1.4 and or1.5 in1.6 between1.7 通配符1.8 like 2.MySQL数据库函数2.1 数学函数2.2 聚合函数2.3 字符串函数 3.查询函数3.1 order by3.2 group by3.3 sql语句执行顺序3.4 having3.5 别名(字段别名…

【剑指offer专项突破版】队列篇——“C“

文章目录 前言一、滑动窗口的平均值题目分析思路分析对列代码题解代码 二、最近请求次数题目分析思路分析队列代码题解代码 三、往完全二叉树添加节点题目分析思路分析队列与接口代码题解代码 四、二叉树每层的最大值题目分析思路分析队列代码题解代码 五、二叉树最底层最左边的…

学习 WooCommerce REST API

主要学习这个技术文档即可 WooCommerce REST API 技术文档 WooCommerce 官方文档 github : woocommerce/woocommerce 以下设置以及测试代码,都来自 WooCommerce REST API 技术文档 设置 REST API 设置 – 固定链接 (Settings > Permalinks.&#…

MySQL - 第4节 - MySQL数据类型

目录 1.数据类型的作用 2.数据类型分类 3.数值类型 3.1.tinyint类型 3.2.bit类型 3.3.float类型 3.4.decimal类型 4.字符串类型 4.1.char类型 4.2.varchar类型 4.3.char和varchar比较 5.时间日期类型 6.enum和set类型 6.1.enum和set类型 6.2.调查表案例 6.3.通…

二手车交易APP开发功能有哪些?

二手车交易APP开发功能有哪些? 1、车辆估价:在选购二手车时,了解车辆的市场价值是非常重要的。为了保证客户能够准确估计车辆的价值,二手车APP软件开发应该具备车辆估价功能。用户可以通过APP输入车辆的基本信息&#xff0…

离线(内网)主机创建python项目运行环境

一、创建requirements.txt文件 文件中是python项目需要的依赖和版本号 二、把依赖下载到本地 准备一个能联网的pc,把依赖下载到本地 pip download -d ./venv -r requirements.txt -i https://pypi.mirrors.ustc.edu.cn/simple/这个命令会把依赖下载到venv文件夹…

指数全线收跌,上证跌破3200点,仅4137只个股下跌!

如题,端午假期前一天,A股指数全线收跌,上证指数跌破3200点,仅4137只个股下跌!就问你服不服? 不要急,不要慌,我们来细细分析。 过去一两周,上证指数以震荡为主&#xff…

嵌入式Linux学习入门

大四毕业了,签了一份嵌入式开发的工作,现在准备入门了,搜集一些要学习的内容。 嵌入式开发学习路线 51单片机,arm,stm32在单片机上 在单片机上编程c语言和在嵌入式系统写c语言,有很大不同 gcc又与我们普…

与反恐、反间谍科同级,美国国家安全部设立网络安全科

美国国家安全部(NSD)成立了一个新的网络部门,旨在能够更有力地应对高技术性的网络威胁。 这个新成立的部门,正式名称为国家网络安全科,是为了响应美国司法部 (DoJ) 2022 年全面网络审查中的核心…

导致JVM内存泄露的ThreadLocal详解

很常见的关于ThreadLocal的面试题的问法: 1.说说你对ThreadLocal的理解。 2.ThreadLocal 是什么?有哪 些使用场景?什么是线程局部变量? 3.ThreadLocal内存泄漏分析与解决方案。 ps:想理解好ThreadLocal,必须先得理…

Spring Boot命令行启动添加参数

一、Spring Boot命令行三种参数形式 通过java -jar启动springboot的jar项目时,可以动态传递参数来进行配置和开发,比如 java -jar xxx.jar --server.port8081 可以通过server.port修改项目启动的端口,通过命令行传递的参数具有更高的优先级…

华为OD机试 JavaScript 实现【最优策略组合下的总的系统消耗资源数】【牛客练习题】,附详细解题思路

一、题目描述 在通信系统中有一个常见的问题是对用户进行不同策略的调度,会得到不同系统消耗的性能。 假设由N个待串行用户,每个用户可以使用A/B/C三种不同的调度策略,不同的策略会消耗不同的系统资源。 请你根据如下规则进行用户调度&…

【Java-SpringBoot+Vue+MySql】Day3.2-RESTful风格

目录 一、RESTful风格介绍 1、知识轰炸 2、代码演练 (1)测试get接口 (2)测试Post接口 (3)测试Put接口 (4)测试delete接口 二、Swagger介绍 1、知识轰炸 2、实操演练 &#x…

Android修行手册-多路USB外接摄像头

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&…

CSS3-盒子模型

盒子模型的介绍 盒子概念 盒子组成 盒子内减 拓展 1. 盒子的概念 1 页面中的每一个标签,都可看做是一个 “盒子”,通过盒子的视角更方便的进行布局 2 浏览器在渲染(显示)网页时,会将网页中的元素看做是一个个的矩形区域…

Selenium详解

Selenium 环境配置好之后,我们就可以使用 Selenium 来操作浏览器,做一些我们想做的事情了。在我们爬取网页过程中,经常发现我们想要获得的数据并不能简单的通过解析 HTML 代码获取,这些数据是通过 AJAX 异步加载方式或经过 JS 渲染…