MySQL学习(四)——事务与存储引擎

news2025/1/11 0:23:57

文章目录

  • 1. 事务
    • 1.1 概念
    • 1.2 事务操作
      • 1.2.1 未设置事务
      • 1.2.2 控制事务
    • 1.3 事务四大特性
    • 1.4 并发事务问题
    • 1.5 事务隔离级别
  • 2. 存储引擎
    • 2.1 MySQL体系结构
    • 2.2 存储引擎
    • 2.3 存储引擎的特点
      • 2.3.1 InnoDB
      • 2.3.2 MyISAM
      • 2.3.3 Memory
      • 2.3.4 区别和比较

1. 事务

1.1 概念

事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

就比如: 张三给李四转账1000块钱,张三银行账户的钱减少1000,而李四银行账户的钱要增加1000。 这一组操作就必须在一个事务的范围内,要么都成功,要么都失败。

正常情况: 转账这个操作, 需要分为以下这么三步来完成 , 三步完成之后, 张三减少1000, 而李四增加1000, 转账成功 ;

异常情况: 转账这个操作, 也是分为以下这么三步来完成 , 在执行第三步是报错了, 这样就导致张三减少1000块钱, 而李四的金额没变, 这样就造成了数据的不一致, 就出现问题了。

为了解决上述的问题,就需要通过数据的事务来完成,我们只需要在业务逻辑执行之前开启事务,执行完毕后提交事务。如果执行过程中报错,则回滚事务,把数据恢复到事务开始之前的状态。

注意: 默认MySQL的事务是自动提交的,也就是说,当执行完一条DML语句时,MySQL会立即隐式的提交事务。

1.2 事务操作

为了体现事务的特性,我们重新建立一张账户管理的表,数据如下:

drop table if exists account;
create table account(
                        id int primary key AUTO_INCREMENT comment 'ID',
                        name varchar(10) comment '姓名',
                        money double(10,2) comment '余额'
) comment '账户表';
insert into account(name, money) VALUES ('张三',2000), ('李四',2000);

1.2.1 未设置事务

首先我们最开始张三和李四的金额都是2000,然后我们一次性执行下面的语句:

-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三';
你干嘛~...
-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四';

上述语句中的第5行不符合语法规范,执行肯定会报错,这个时候我们再查看数据库中的数据,查询如下:

在这里插入图片描述

可以看到,张三的钱减少了,但是李四的前也没有增加,这就是一个错误的操作。

1.2.2 控制事务

控制事务的语句如下:

  • 查看/设置事务提交方式

    SELECT @@autocommit ;
    SET @@autocommit = 0 ;
    
  • 开始事务

    START TRANSACTIONBEGIN ;
    
  • 提交事务

    COMMIT;
    
  • 回滚事务

    ROLLBACK
    

注意:上述的这种方式,我们是修改了事务的自动提交行为, 把默认的自动提交修改为了手动提交, 此时我们执行的DML语句都不会提交, 需要手动的执行commit进行提交。

上面转账的语句加上了事务控制后如下所示:

-- 开启事务
start transaction
-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三';
-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四';
-- 如果正常执行完毕, 则提交事务
commit;
-- 如果执行过程中报错, 则回滚事务
-- rollback;

1.3 事务四大特性

事务具有四大特性:

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

上述就是事务的四大特性,简称ACID

1.4 并发事务问题

  1. 脏读

    指一个事务读到另外一个事务还没有提交的数据。

    在这里插入图片描述

    比如上面的B读取到了A未提交的数据。

  2. 不可重复读

    指一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
    在这里插入图片描述

    事务A两次读取同一条记录,但是读取到的数据却是不一样的。

  3. 幻读

    指一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 “幻影”。

    在这里插入图片描述

1.5 事务隔离级别

为了解决并发事务所引发的问题,在数据库中引入了事务隔离级别。主要有以下几种:

隔离级别脏读不可重复读幻读
Read uncommited ✓ \checkmark ✓ \checkmark ✓ \checkmark
Read commited× ✓ \checkmark ✓ \checkmark
Repeatable Read(默认)×× ✓ \checkmark
Serializable×××
  • 查看事务隔离级别

    SELECT @@TRANSACTION_ISOLATION;
    
  • 设置事务隔离级别

    SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
    

注意:事务隔离级别越高,数据越安全,但是性能越低。

2. 存储引擎

2.1 MySQL体系结构

MySQL的体系结构可以分为客户层、服务层、存储引擎层、物理层四个方面,其结构如下:

在这里插入图片描述

  1. 客户层

    最上层是一些客户端和链接服务,包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。

  2. 服务层

    第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如 过程、函数等。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定表的查询的顺序,是否利用索引等,最后生成相应的执行操作。如果是select语句,服务器还会查询内部的缓存,如果缓存空间足够大,这样在解决大量读操作的环境中能够很好的提升系统的性能。

  3. 存储引擎层

    存储引擎层, 存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API和存储引擎进行通信。不同的存储引擎具有不同的功能,这样我们可以根据自己的需要,来选取合适的存储引擎。数据库中的索引是在存储引擎层实现的。

  4. 物理层

    主要是将数据(如: redolog、undolog、数据、索引、二进制日志、错误日志、查询日志、慢查询日志等)存储在文件系统之上,并完成与存储引擎的交互。

2.2 存储引擎

存储引擎是mysql数据库的核心,存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。我们可以在创建表的时候,来指定选择的存储引擎,如果没有指定将自动选择默认的存储引擎。

  • 建表时指定存储引擎

    CREATE TABLE 表名(
        字段1 字段1类型 [ COMMENT 字段1注释 ] ,
        ......
        字段n 字段n类型 [COMMENT 字段n注释 ]
    ) ENGINE = INNODB [ COMMENT 表注释 ] ;
    

    只需要在建立的表的后面添加一个 ENGINE= 的字段即可。

  • 查询当前数据库支持的存储引擎

    show engines;
    

    查询结果如下:

    在这里插入图片描述

    可以看到,上面支持的数据库引擎其 Support 一列标注为 YES ,不支持的标注为 NOInnoDB 数据库引擎设置为是默认引擎。

  • 创建其他引擎

    以创建 MEEMORY 引擎为例,创建的语句如下:

    create table my_memory(
        id int,
        name varchar(10)
    ) engine = Memory ;
    

2.3 存储引擎的特点

这里我们主要介绍三种引擎 InnoDB, MyISAM, Memory 的特点。

2.3.1 InnoDB

  1. 简单介绍

    InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在 MySQL 5.5 之后,InnoDB是默认的 MySQL 存储引擎。

    其特点如下:

    • DML操作遵循ACID模型,支持事务;
    • 行级锁,提高并发访问性能;
    • 支持外键FOREIGN KEY约束,保证数据的完整性和正确性;
  2. 文件存储

    InnoDB 引擎的每张表都会对应一个 ibd 表空间文件,存储该表的表结构、数据和索引。

    我们直接打开MySQL安装时的数据存放目录,这个目录下有很多文件夹,不同的文件夹代表不同的数据库,我们直接打开study文件夹,可以看到其中的文件目录如下:

    在这里插入图片描述

    可以看到里面有很多的ibd文件,每一个ibd文件就对应一张表,比如:我们有一张表 account,就有这样的一个account.ibd文件,而在这个ibd文件中不仅存放表结构、数据,还会存放该表对应的索引信息。 而该文件是基于二进制存储的,不能直接基于记事本打开,我们可以使用mysql提供的一个指令 ibd2sdi ,通过该指令就可以从ibd文件中提取sdi信息,而sdi数据字典信息中就包含该表的表结构。

    在这里插入图片描述

  3. 逻辑存储结构

    InnoDB引擎中的逻辑结构最高层时表空间,一个表空间中含有若干个段,一个段中含有若干的区,一个区包含若干个页,一个页包含若干个行,其关系如下:

    在这里插入图片描述

    各个结构如下:

    • 表空间 : InnoDB存储引擎逻辑结构的最高层,ibd文件其实就是表空间文件,在表空间中可以包含多个Segment段。
    • : 表空间是由各个段组成的, 常见的段有数据段、索引段、回滚段等。InnoDB中对于段的管理,都是引擎自身完成,不需要人为对其控制,一个段中包含多个区。
    • : 区是表空间的单元结构,每个区的大小为1M。 默认情况下, InnoDB存储引擎页大小为16K, 即一个区中一共有64个连续的页。
    • : 页是组成区的最小单元,页也是InnoDB 存储引擎磁盘管理的最小单元,每个页的大小默认为 16KB。为了保证页的连续性,InnoDB 存储引擎每次从磁盘申请 4-5 个区。
    • : InnoDB 存储引擎是面向行的,也就是说数据是按行进行存放的,在每一行中除了定义表时所指定的字段以外,还包含两个隐藏字段(后面会详细介绍)。

2.3.2 MyISAM

MyISAM是MySQL早期的默认存储引擎。

其特点为:

  • 不支持事务,不支持外键
  • 支持表锁,不支持行锁
  • 访问速度快

MyISAM的表分为三个文件进行存储:

  • .sdi:存储表结构信息
  • .MYD: 存储数据
  • .MYI: 存储索引

2.3.3 Memory

Memory引擎的表数据时存储在内存中的,由于受到硬件问题、或断电问题的影响,只能将这些表作为临时表或缓存使用。

其存储采用的时hash索引。

存放的表的文件为 .sdi ,存储表结构信息。

2.3.4 区别和比较

特点InnoDBMyISAMMemory
存储限制64TB
事务安全支持不支持不支持
锁机制行锁表锁表锁
B+树索引支持支持支持
Hash索引不支持不支持支持
全文索引支持支持不支持
空间使用
内存使用中等
批量插入速度
支持外键支持不支持不支持

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

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

相关文章

如何实现前端单页面应用(SPA)?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

(三十三)geoserver源码添加新的数据存储

1.添加新的数据存储 如下图所示,为我们经常操作的添加数据存储的界面。 可以看到这个代码在如下的位置。在这样的代码中实现跳转。header.add(new BookmarkablePageLink("addNew", NewDataPage.class)); public class StorePage extends GeoServerSecur…

Notes/Domino 14 Early Access Drop3发布

大家好,才是真的好。 其实上周,就是国庆假期的时候,HCL Notes/Domino 14 Early Access Drop3(以下简称EA3)就已经发布,而且和传说中的一样,带来了数项惊人的新特性。 我们先讲讲这一版本新特性…

正向代理——流量代理

文章目录 流量代理1. 正向代理2. 反向代理3. 流量转发工具4. 实验4.1 实验环境4.2 reGeorg工具 流量代理 1. 正向代理 正向代理是客户端和其他所有服务器(重点:所有)的代理者 2. 反向代理 反向代理是客户端和所要代理的服务器之间的代理。…

3.3 Tessellation Shader (TESS) Geometry Shader(GS)

一、曲面细分着色器的应用 海浪,雪地等 与置换贴图的结合 二、几何着色器的应用 几何动画 草地等(与曲面着色器结合) 三、着色器执行顺序 1.TESS的输入与输出 输入 Patch,可以看成是多个顶点的集合,包含每个顶点的属…

无线设备天线的选型及其安装注意事项

天线作为无线传输过程中一个必不可少的配件,因此天线的安装和选型对于无线传输的稳定性发挥着至关重要的作用。本文将介绍影响天线安装对于无线通信效果的影响。 一、天线的工作原理 天线是一种能量变换器,它把传输线上传播的导行波,变换成在…

innovus:antenna设置

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 innovus和ICC2还不一样,ICC2需要读antenna rule,innovus只看antenna lef,所以要检查一下lef里antenna信息全不全。 然后设置如下option: s…

实验室超声波清洗机如何进行提取、乳化?

近年来,超声波清洗机已被广泛应用于实验室中,如提取、清洗、乳化等,由于其具有高效、节能和自动化程度高等其他技术不可比拟的优势,现已在各行各业广泛应用,本文主要就实验室超声波清洗机提取、乳化方面做个简单的介绍…

流量代理——正向代理

流量代理 正向代理和反向代理 正向代理就是客户端和其他所有服务器(重点:所有)的代理者。 反向代理是客户端和所要代理的服务器之间的代理。 流量转发工具 需要放在拿到shell的服务器上可使用 lcx:端口流量转发,不具…

百度百科词条编辑要求,怎样创建百度百科之实操篇

大部分人都不知道百度百科词条编辑有什么要求,也不知道百度百科词条内容到底是否靠谱,下面洛希爱做百科网将为大家带来百度百科创建实操技能分享。 1、百度一下【百度百科】找到百度词条的官网 2、打开百度百科的官网 我们就会发现 总共创建了多少个百度…

SpringCloud ---day1

认识微服务 单体架构 微服务架构 方便进行打包上线,版本的更新上线,降低项目之间的耦合度,减少代码量巨大导致的编译/打包时间长的问题 SpringCloud简介 项目熟悉 业务流程 项目模块划分 服务拆分原则 什么时候拆: 对于一个初创的项目,首先要做的是验证项目的可…

如何进行前端代码打包和压缩?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

优秀的推荐系统架构与应用:从YouTube到Pinterest、Flink和阿里巴巴

文章目录 🌟 业界经典:YouTube深度学习推荐系统的经典架构长什么样?🍊 基础架构🍊 深度学习模型🍊 额外组件 🌟 图神经网络:Pinterest如何应用图神经网络的?&#x1f34a…

如何构建前端自动化测试套件?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

PBootCMS解析、例子

一、分析以下程序 {pboot:nav num10 parent0}<li class"nav-item {pboot:if([nav:scode]{sort:tcode})}active{/pboot:if}"><a class"nav-link" href"[nav:link]">[nav:name]</a></li> {/pboot:nav} 当前栏目的顶级栏目…

ruoyi-cloud 升级mybatis plus 报错 Invalid bound statement (not found)

1.项目是用的ruoyi-cloud 2.项目自带mybatis 想升级为mybatis plus 3.mybatis plus集成后,启动正常,但是dao访问xml时,报错Invalid bound statement (not found) 4.试了好多次无果,后来又把application.yml的mybatis-plus换成mybatis,目的是查看是否mybatis能否正确关联到sq…

C++:超越C语言的独特魅力

W...Y的主页&#x1f60a; 代码仓库分享&#x1f495; &#x1f354;前言&#xff1a; 今天我们依旧来完善补充C&#xff0c;区分C与C语言的区别。上一篇我们讲了关键字、命名空间、C的输入与输出、缺省参数等知识点。今天我们继续走进C的世界。 目录 函数重载 函数重载概…

Linux常用命令——command命令

在线Linux命令查询工具 command 调用并执行指定的命令 补充说明 command命令调用指定的指令并执行&#xff0c;命令执行时不查询shell函数。command命令只能够执行shell内部的命令。 语法 command(参数)参数 指令&#xff1a;需要调用的指令及参数。 实例 使用command…

好奇喵 | Rust编程语言的简单了解~

前言 有时候会听到别人谈论小众的语言&#xff0c;最近经常听到rust语言&#xff0c;感觉很厉害的样子&#xff0c;就简单了解了一下。 Rust 语言是一种高效、可靠的通用高级语言。其高效不仅限于开发效率&#xff0c;它的执行效率也是令人称赞的&#xff0c;是一种少有的兼顾…

lesson0-C++入门(6000余字详细配图讲解)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 1. C关键字 2. 命名空间 ​编辑 3. C输入&输出 4. 缺省参数 5. 函数重载 6. 引用 7. 内联函数 1. C关键字 C总计63个关键字&#xff0c;C语言32个关键字&#xff0c;C兼容%99的C语言&#xff0c;只有极少…