MySQL 存储引擎事务

news2024/11/15 11:40:47

MySQL存储引擎&事务

    • 一、MySQL 存储引擎
      • 1、怎么查看/添加“存储引擎”?
      • 2、常用存储引擎简介
    • 二、MySQL 事务
      • 1、什么是事务?
      • 2、事务是怎么做到多条DML语句同时成功和同时失败的呢?
      • 3、事务四大特性 ACID
      • 4、四个隔离级别

一、MySQL 存储引擎

存储引擎:实际上存储引擎是一个表存储/组织数据的方式。不同的存储引擎,表存储数据的方式不同。

1、怎么查看/添加“存储引擎”?

使用语句 show create table t_student 可以查看表结构:

在建表的时候可以在最后小括号的")"的右边使用:ENGINE 来指定存储引擎。CHARSET来指定这张表的字符编码方式。

CREATE TABLE `t_student` (
  `no` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `cno` int(11) DEFAULT NULL,
  PRIMARY KEY (`no`),
  KEY `cno` (`cno`),
  CONSTRAINT `t_student_ibfk_1` FOREIGN KEY (`cno`) REFERENCES `t_class` (`classno`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8
create table t_product(
    id int primary key,
    name varchar(255)
)engine=InnoDB default charset=gbk;

可使用如下语句查看当前服务器支持哪些存储引擎:

show engines \G

2、常用存储引擎简介

  1. MyISAM 存储引擎:MyISAM 表最适合于大量的数据读而少量数据更新的混合操作。MyISAM 表的另一种适用情形是使用压缩的只读表。

  2. InnoDB 存储引擎:如果查询中包含较多的数据更新操作,应使用 InnoDB。其行级锁机制和多版本的支持为数据读取和更新的混合操作提供了良好的并发机制。

  3. MEMORY 存储引擎:可使用 MEMORY 存储引擎来存储非永久需要的数据,或者是能够从基于磁盘的表中重新生成的数据。

二、MySQL 事务

1、什么是事务?

一个事务 transaction 其实就是一个完整的业务逻辑。是一个最小的工作单元。不可再分。

这里举个例子:假设转账,从A账户向B账户中转账10000。将A账户的钱减去10000(update语句),将B账户的钱加上10000(update语句)这就是一个完整的业务逻辑。

update account set balance = balance-10000 where id = 'A';
update account set balance = balance+10000 where id ='B'; 

以上的操作是一个最小的工作单元,要么同时成功,要么同时失败,不可再分,这样才能保证钱是正确的。。事务就是为了解决类似于转账僵硬的问题。事务的本质就是把多个sql语句给打包成一个整体,要么全都执行,要么就一个都不执行,而不会出现“执行一半”这样的中间状态。

注:只有 DML 语句(insert、delete、update)才会有事务这一说,其它SQL语句和事务无关。主要是因为因为 只有以上的三个语句是数据库表中数据进行增、删、改的。只要你的操作一旦涉及到数据的增、删、改,那么就一定要考虑安全问题。因此需要事务保证数据的完整性。

2、事务是怎么做到多条DML语句同时成功和同时失败的呢?

MySQL 事务都是指在 InnoDB 引擎下,在InnoDB存储引擎中,提供一组用来记录事务性活动的日志文件。在事务的执行过程中,每一条DML的操作都会记录到“事务性活动的日志文件”中。在事务的执行过程中,我们可以提交事务,也可以回滚事务。

开启事务:start transaction;
mysql默认情况下是支持自动提交事务的。也就是说每执行一条DML语句,则提交一次!这种自动提交实际上是不符合我们的开发习惯,因为一个业务通常是需要多条DML语句共同执行才能完成的,为了保证数据的完整性,必须要求同时成功之后再提交,所以不能执行一条就提交一条。此时我们可以使用命令 set autocommit = OFF;或set autocommit = ON;来取消/开启自动提交,或者手动开启一个事务:start transaction;

提交事务:commit; 语句
清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中。提交事务标志着,事务的结束。并且是一种全部成功的结束。

回滚事务:rollback; 语句
将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件。回滚事务标志着,事务的结束。并且是一种全部失败的结束。

注意:回滚永远都是只能回滚到上一次的提交点!

回滚事务演示:

提交事务演示:

3、事务四大特性 ACID

  1. 原子性(Atomicity) 整个事务中的所有操作,必须作为一个单元全部完成(或全部取消)。
  2. 一致性(Consistency) 在事务开始之前与结束之后,数据库都保持一致状态。即在同一个事务当中,所有操作必须同时成功,或者同时失败,以保证数据的一致性。
  3. 持久性(Durability) 在事务完成以后,该事务对数据库所作的更改将持久地保存在数据库之中,并不会被回滚。
  4. 隔离性(Isolation) 一个事务不会影响其他事务的运行,一般存在于多个事务“并发”执行。例如教室A和教室B之间有一道墙,这道墙就是隔离性。

当多个客户端并发地访问同一个表时,可能出现下面的一致性问题:

  1. 脏读取(Dirty Read) 一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交,这就出现了脏读取。此时的读操作就称为脏读,读到的数据也称为脏数据(无效数据)。
  2. 不可重复读(Non-repeatable Read) 在同一个事务中,同一个读操作对同一个数据的前后两次读取产生了不同的结果,这就是不可重复读。例如在事务开启之后,第一次读到的数据是3条,当前事务还没有结束,可能第二次再读取的时候,读到的数据是4条,导致两次读取数据不一致,称为不可重复读取。
  3. 幻像读(Phantom Read) 每一次读取到的数据都是幻象。不够真实!例如早晨9点开始开启了事务,只要事务不结束,到晚上9点,读到的数据还是那样!读到的是假象。不够绝对的真实。

4、四个隔离级别

为了解决上述并发访问时可能会出现的问题,InnoDB 实现了四个隔离级别:

  1. 读未提交:read uncommitted—没有提交就读到了
    事务A可以读取到事务B未提交的数据。最低的隔离级别,效率最高。

说明:这种隔离级别一般都是理论上的,大多数的数据库隔离级别都是二级起步

  1. 读已提交:read committed—提交之后才能读到
    事务A只能读取到事务B提交之后的数据。

说明:解决了脏读的现象。oracle数据库默认的隔离级别是:read committed

  1. 可重复读:repeatable read—提交之后也读不到,永远读取的都是刚开启事务时的数据
    事务A开启之后,不管是多久,每一次在事务A中读取到的数据都是一致的。即使事务B将数据已经修改,并且提交了,事务A读取到的数据还是没有发生改变,这就是可重复读。

说明:解决了不可重复读取数据。mysql中默认的事务隔离级别就是这个

  1. 序列化/串行化:serializable
    将一个事务与其他事务完全地隔离,每一次读取到的数据都是最真实的。隔离级别最高,由于不能并发,所以效率最低。这种隔离级别解决了以上所有的问题。

总结:隔离级别与一致性问题

隔离级别脏读不可重复读幻读
读未提交可能可能可能
读已提交不可能可能可能
可重复读不可能不可能可能
串行化不可能不可能不可能

拓展:

  1. 查看隔离级别可使用命令 select @@tx_isolation;
  2. 设置全局隔离级别 set global transaction isolation level 隔离级别;

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

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

相关文章

如何下载jmeter旧版本

如何下载jmeter旧版本 推荐先用旧版本做好测试基本操作,因为高版本不适合做压力测试,需要证书,有点麻烦。 1.百度或直接打开jmeter官网:https://jmeter.apache.org/ 2.向下拖到Archives一栏,点击Apache Jmeter archi…

项目:简易Mybatis

目录 一、新建项目 二、新建模块 三、回顾JDBC 四、准备环境 五、使用dom4j解析xml文件 六、开始,编写Mapper解析API 1、自定义Resources类 2、定义Configuration类 3、定义MappedStatement类 4、定义XmlMapperBuilder类 5、更新一下UserMapper.xml和UserMapper接口 …

一文彻底带你搞懂什么是适配器模式!!

一文彻底带你搞懂什么是适配器模式!! 什么是适配器模式?适配器的两种实现方式适用情况代码示例背景类适配器对象适配器 IO流中的实际应用应用扩展 总结 什么是适配器模式? 适配器模式(Adapter Pattern)是作…

web自动化(六)unittest 四大组件实战(京东登录搜索加入购物车)

Unittest框架 Unittest框架:框架测试模块测试管理模块测试统计模块,python的内置模块 import unittest Unittest框架四大组件: 1、TestCase 测试用例 2.TestFixture 测试用例夹具 测试用例需要执行的前置和后置 3.TestSuite 测试套件 把需要执行的测试用例汇总在一…

什么是企业服务总线?它包含哪些技术组件?

我们每个人都会去医院,您描述下我们去医院的场景,然后引出这个挂号流程,通过挂号流程中的一个问题或者什么东西来吸引他的好奇心,这样呢?会比现在的预设场景好一些。我举个例子,人工智能怎么帮人看病。如果…

前端面试题23(css3)

关于CSS3的面试题,我们可以从多个维度来探讨,包括但不限于选择器、盒模型、布局技术、动画与过渡、响应式设计等。下面我会列举一些典型的CSS3面试问题,并尽可能提供详细的解答或示例代码。 1. CSS3中新增了哪些选择器? 答案: C…

【Java安装】windows10+JDK21+IDEA

文章目录 一、JDK安装1. 下载完成后按照自己需要的位置安装2. 配置环境变量2.1 JAVA_HOME变量2.2 PATH配置 3. 验证4. helloworld 二、IDEA安装三、IDEA-HelloWorld 一、JDK安装 JDK安装链接 1. 下载完成后按照自己需要的位置安装 2. 配置环境变量 2.1 JAVA_HOME变量 安装…

手机飞行模式是什么意思?3个方法教你如何开启

在现代生活中,手机已经成为我们日常生活中不可或缺的一部分。然而,有时我们需要暂时切断手机的通信功能,比如在飞机上、开会时或需要安静休息的时候。这时候,苹果手机上的“飞行模式”功能就派上了用场。 那么,手机飞…

【从零到一,如何搭建本地AI大模型】

摘要: 本文主要记录这一段时间对本地大模型搭建的心得。 作为一个资深程序员,在AI席卷全球的时候,深深感觉到了一丝危机感,不禁有一个想法不断在脑海闪现:我会不会真的哪一天被AI给取代了? 从哪入手 程序员出生的我,掌握了很多语言,从前端到数据库,再到运维,基本都…

uniapp-小程序获取用户位置

1. 需要在微信公众平台进行接口的申请。选择自己需要用的接口。 2. 在app.json文件中配置permission和requiredPrivateInfos。requiredPrivateInfos里面是你需要使用的接口。 3. 配置完成后,就可以使用了。 相关获取位置API的链接 4. 如果要获取当前位置到某一个指…

VS 附加进程调试

背景: 此方式适合VS、代码和待调试的exe在同一台机器上。 一、还原代码到和正在跑的exe同版本 此操作可以保证能够调试生产环境的exe 二、设置符号路径 1.调试->选项 三、附加进程 方式1: 打开VS,调试->附加到进程,出…

【MySQL】MySQL连接池原理与简易网站数据流动是如何进行

MySQL连接池原理与简易网站数据流动是如何进行 1.MySQL连接池原理2.简易网站数据流动是如何进行 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃&#x1f60…

【Go】常见的变量与常量

变量 常见的变量声明方式 一、声明单个变量的多种方式 1.声明一个变量初始化一个值 //声明变量 默认值是0,var a int//初始化一个值a 1fmt.Println(a) 2. 在初始化的时候省去数据类型,通过值自动匹配当前的变量的数据类型 var b 2fmt.Println(&quo…

7月6日 VueConf 技术大会即将在深圳举办

7月6日,VueConf 2024 即将在深圳召开,本次大会正值 Vue.js 十周年,旨在聚焦 Vue.js 社区的成员,分享最新的技术动态、经验以及创新实践。 本次参与 VueConf 大会的是来自全球 Vue.js 核心团队成员、行业专家及前端开发者。其中&a…

Java语言程序设计——篇二(1)

Java语言基础 数据类型关键字与标识符关键字标识符 常量与变量1、常量2、变量 类型转换自动类型转换强制类型转换 数据类型 数据的基本要素数据的性质(数据结构)数据的取值范围(字节大小)数据的存储方式参与的运算 Java是一门强类…

NodeJS蔬菜自产零售混合销售平台-计算机毕业设计源码10149

摘 要 随着移动互联网的快速发展,购物方式也发生了巨大的变化。蔬菜作为消费者生活中必不可少的商品之一,在移动互联网时代也迎来了新的购物方式——购物小程序。购物小程序是一种基于手机应用平台的轻量级应用程序,用户可以通过它方便地浏览…

C++第二弹 -- C++基础语法下(引用 内联函数 auto关键字 范围for 指针空值)

本篇大纲 前言一. 引用续讲1. 传值,传引用效率对比2. 类型转换和表达式传引用的注意事项3. 引用与指针 二. 内联函数1. 概念2. 特性3. 面试题 三. auto关键字(C11)1. 类型别名思考2. auto简介3. auto的使用细则4. auto不能推导的场景 四. 基于范围的for循环(C11)1. 范围for的语…

3DMAX软件如何导出和导入模型

在3DMAX软件中导出和导入模型的过程相对直观,以下是具体的步骤:导出模型:1、选择模型:首先,在3DMAX的视图中选择你想要导出的模型。2、导出设置:点击菜单栏中的“文件”(File)&#…

现货黄金技术出现这一信号赶紧止损!

很多现货黄金投资者都并不知道,移动平均线除了可以用于寻找进场的机会,还可以用来设置止损,让自己在交易中更好地进行防守。其实移动平均线止损,是常用的技术止损方法之一,本文将和大家分享怎样利用均线设置止损点&…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【加密导入密钥(C/C++)】

加密导入密钥(C/C) 以加密导入ECDH密钥对为例,涉及业务侧加密密钥的[密钥生成]、[协商]等操作不在本示例中体现。 具体的场景介绍及支持的算法规格。 在CMake脚本中链接相关动态库 target_link_libraries(entry PUBLIC libhuks_ndk.z.so)开发步骤 设备A&#xf…