当前位置: 首页 > news >正文

MySQL 中的事务和存储引擎

目录

事务的 ACID 特性

MySQL 的四种隔离机制和问题

MySQL 的四种隔离机制:

MySQL 的存储引擎

InnoDB 存储引擎

MyISAM 存储引擎

Memory 存储引擎

通过 ALTER TABLE 语句更改存储引擎

在创建表时指定存储引擎

通过修改配置文件设置默认存储引擎


在数据库系统中,事务是指一组操作被当作一个单元来执行,要么全部成功提交,要么全部失败回滚。而存储引擎则是数据库管理系统中负责数据存储和管理的核心组件。在 MySQL 中,了解事务的 ACID 特性、隔离级别以及不同的存储引擎对于设计和优化数据库系统非常重要。

事务的 ACID 特性

在 MySQL 中,事务遵循 ACID 特性,确保了数据的一致性和完整性:

  • 原子性:事务中的所有操作要么全部执行成功,要么全部失败回滚,不会出现部分执行的情况。
  • 一致性:事务将数据库从一种一致状态转换为另一种一致状态,即使在事务执行过程中出现错误也会回滚到初始状态。
  • 隔离性:事务的执行不受其他事务的影响,每个事务看到的数据是一致的,防止了数据的交叉干扰。
  • 持久性:一旦事务提交,对数据的修改将永久保存在数据库中,即使发生系统故障也不会丢失。

MySQL 的四种隔离机制和问题

MySQL 提供了四种事务隔离级别,分别是:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。每种隔离级别都有不同的特点,也会导致不同的问题:

  • 脏读(Dirty Read):一个事务读取了另一个事务未提交的数据。
  • 不可重复读(Non-Repeatable Read):一个事务在读取同一数据行时,由于其他事务的修改导致了多次读取结果不一致。
  • 幻读(Phantom Read):一个事务读取了另一个事务提交的新数据,导致前后两次查询的结果集不一致。
  • 丢失更新(Lost Update):两个事务同时读取同一数据行,并且都修改了这一行,但只有一个事务的修改生效了。

MySQL 的四种隔离机制:

  • 读未提交(Read Uncommitted):允许事务读取未提交的数据,可能出现脏读、不可重复读、幻读、丢失更新问题。
  • 读已提交(Read Committed):保证一个事务不会读取到另一个事务未提交的数据,解决了脏读问题,但仍可能出现不可重复读、幻读、丢失更新问题。
  • 可重复读(Repeatable Read):保证一个事务在执行过程中多次读取同一数据行的结果是一致的,解决了不可重复读问题,但仍可能出现幻读、丢失更新问题。
  • 串行化(Serializable):最高级别的隔离级别,完全解决了脏读、不可重复读、幻读、丢失更新问题,但性能较低。

MySQL 的存储引擎

MySQL 的存储引擎是指数据库管理系统底层的组件,负责数据的存储、索引和管理。不同的存储引擎具有不同的特点和功能,适用于不同的场景和需求。 MySQL 中常见的存储引擎,包括 InnoDB、MyISAM、Memory 等。

InnoDB 存储引擎

  • 特点

    • 支持事务(ACID):提供了事务的支持,可以实现数据的一致性和完整性。
    • 行级锁定:支持行级锁定,可以提高并发性能,减少锁冲突。
    • 外键约束:支持外键约束,保证数据的完整性。
    • 支持全文索引:可以对文本类型的数据进行全文搜索。
    • 自动崩溃恢复:具有自动崩溃恢复功能,可以在 MySQL 重启后自动恢复数据。
  • 优点

    • 适合大量写入和读取的应用:对于需要高并发读写、数据完整性要求高的应用非常适用。
    • 支持事务:可以实现数据的一致性,适合需要事务支持的应用。
    • 外键约束:对于有复杂关系的数据库设计,外键约束非常有用。
  • 缺点

    • 内存占用较大:相比于其他存储引擎,InnoDB 的内存占用较大。
    • 性能损失:由于支持事务和行级锁定,性能可能相对较低。
  • 适用场景

    • 需要事务支持和数据完整性的应用:如电子商务网站、金融系统等。
    • 高并发读写的应用:对于需要大量的并发读写操作的应用非常适用。
    • 复杂关系的数据库设计:对于需要建立复杂关系的数据库结构,外键约束非常有用。

MyISAM 存储引擎

  • 特点

    • 不支持事务:不提供事务的支持,对于简单的读取操作较为适用。
    • 表级锁定:锁定的粒度是整个表,不能实现行级锁定。
    • 全文索引:支持全文索引,可以对文本类型的数据进行全文搜索。
    • 性能较高:在读取操作上性能较高,适合读取频繁的应用。
  • 优点

    • 内存占用较小:相比于 InnoDB,MyISAM 的内存占用较小。
    • 性能较高:在读取操作上性能较高,适合读取频繁的应用。
  • 缺点

    • 不支持事务:对于需要事务支持的应用不适用。
    • 表级锁定:锁定的整个表,可能导致并发性能下降。
    • 不支持外键约束:对于需要外键约束的数据库设计不适用。
  • 适用场景

    • 只读的数据仓库:对于只读的数据仓库或者读取操作频繁的应用非常适用。
    • 日志、存档等:对于需要高性能的写入操作,但不需要事务和复杂查询的应用。
    • 简单的数据库设计:对于简单的数据库结构,不需要复杂关系和外键约束的应用。

Memory 存储引擎

  • 特点

    • 将表存储在内存中:数据存储在内存中,读写速度非常快。
    • 不支持事务和外键约束:不支持事务和外键约束,主要用于临时表、缓存等场景。
    • 表级锁定:锁定的粒度是整个表,不支持行级锁定。
  • 优点

    • 读写速度快:由于数据存储在内存中,读写速度非常快。
    • 适用于临时数据:对于临时数据、缓存等场景非常适用。
  • 缺点

    • 数据丢失:数据存储在内存中,MySQL 重启后数据丢失。
    • 不支持事务和外键约束:对于需要事务和外键约束的应用不适用。
    • 表级锁定:锁定的粒度是整个表,可能导致并发性能下降。
  • 适用场景

    • 临时数据和缓存:对于临时数据、缓存等场景非常适用。
    • 测试和开发环境:对于测试和开发环境中的临时数据存储非常方便。

通过 ALTER TABLE 语句更改存储引擎

假设 school 数据库中有一个表名为 class,我们想将其存储引擎从默认的 InnoDB 更改为MyISAM:

ALTER TABLE class ENGINE = MyISAM;

在创建表时指定存储引擎

假设要创建一个新的 class 表,并将存储引擎设置为 MyISAM:

CREATE TABLE class (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50)) ENGINE = MyISAM;

通过修改配置文件设置默认存储引擎

在 my.cnf中设置默认存储引擎:

[mysqld]
default_storage_engine = MyISAM

设置完成后,重启 MySQL 服务,新创建的表就会默认使用 MyISAM 存储引擎。已存在的表存储引擎不会被更改,在创建表时如果手动指定使用的存储引擎,则使用手动指定的存储引擎。

相关文章:

MySQL 中的事务和存储引擎

目录 事务的 ACID 特性 MySQL 的四种隔离机制和问题 MySQL 的四种隔离机制: MySQL 的存储引擎 InnoDB 存储引擎 MyISAM 存储引擎 Memory 存储引擎 通过 ALTER TABLE 语句更改存储引擎 在创建表时指定存储引擎 通过修改配置文件设置默认存储引擎 在数据库系…...

echarts多个折线图共用一个x轴和tooltip组件

实现效果 根据接口传来的数据&#xff0c;使用echarts绘制出&#xff0c;共用一个x轴的图表 功能&#xff1a;后端将所有数据传送过来&#xff0c;前端通过监听选中值来展示对应的图表数据 数据格式&#xff1a; 代码&#xff1a; <template><div><div clas…...

wireshark数据捕获实验简述

Wireshark是一款开源的网络协议分析工具&#xff0c;它可以用于捕获和分析网络数据包。是一款很受欢迎的“网络显微镜”。 实验拓扑图&#xff1a; 实验基础配置&#xff1a; 服务器&#xff1a; ip:172.16.1.88 mask:255.255.255.0 r1: sys sysname r1 undo info enable in…...

如何利用RunnerGo简化性能测试流程

在软件开发过程中&#xff0c;测试是一个重要的环节&#xff0c;需要投入大量时间和精力来确保应用程序或网站的质量和稳定性。但是&#xff0c;随着应用程序变得更加复杂和庞大&#xff0c;传统的测试工具在面对比较繁琐的项目时非常费时费力。这时&#xff0c;一些自动化测试…...

继承和深拷贝封装

继承和深拷贝封装 今日目标&#xff1a; 1.es5寄生组合式继承 2.es6类的继承 3.深拷贝函数封装 00-回顾 # 不同数据类型赋值时的区别&#xff1a; 基本数据类型&#xff0c;赋的就是值&#xff0c;相互之间不再有任何影响 引用数据类型&#xff0c;赋的是地址&#xff0c…...

《定时执行专家》:Nircmd 的超级搭档,解锁自动化新境界

目录 Nircmd 简介 《定时执行专家》与 Nircmd 的结合 示例&#xff1a; 自动清理电脑垃圾: 定时发送邮件: 定时关闭电脑: 《定时执行专家》的优势: 总结: 以下是一些其他使用示例&#xff1a; 立即下载《定时执行专家》&#xff1a; Nircmd 官方网站&#xff1a; 更…...

Android 封装的工具类

文章目录 日志封装类-MyLog线程封装类-LocalThreadPools自定义进度条-LoadProgressbar解压缩类-ZipUtils本地数据库类-MySQLiteHelper访问webservice封装-HttpUtilsToolbar封装类-MaterialToolbar网络请求框架-OkGo网络请求框架-OkHttp 日志封装类-MyLog 是对android log的封装…...

linux下线程分离属性

linux下线程分离属性 一、线程的属性---分离属性二、线程属性设置2.1 线程创建前设置分离属性2.2 线程创建后设置分离属性 一、线程的属性—分离属性 什么是分离属性&#xff1f; 首先分离属性是线程的一个属性&#xff0c;有了分离属性的线程&#xff0c;不需要别的线程去接合…...

Leetcode 208. 实现 Trie (前缀树)

心路历程&#xff1a; 一道题干进去了一个下午&#xff0c;单纯从解题角度可以直接用python的集合就很简单地解决&#xff08;不知道是不是因为python底层的set()类&#xff09;。后来从网上看到这道题应该从前缀树的角度去做&#xff0c;于是花了半个多小时基于字典做了前缀树…...

蓝桥杯练习题——健身大调查

在浏览器中预览 index.html 页面效果如下&#xff1a; 目标 完成 js/index.js 中的 formSubmit 函数&#xff0c;用户填写表单信息后&#xff0c;点击蓝色提交按钮&#xff0c;表单项隐藏&#xff0c;页面显示用户提交的表单信息&#xff08;在 id 为 result 的元素显示&#…...

React——组件通讯

组件通讯介绍 组件中的状态是私有的&#xff0c;组件的状态只能在组件内部使用&#xff0c;无法直接在组件外使用&#xff0c;但是我们在日常开发中&#xff0c;通常会把相似、功能完整的应用才分成组件&#xff08;工厂模式&#xff09;利于我们的开发&#xff0c;而不同组件直…...

php闭包应用

laravel 路由 bingTo 把路由URL映射到匿名回调函数上&#xff0c;框架会把匿名回调函数绑定到应用对象上&#xff0c;这样在匿名函数中就可以使用$this关键字引用重要的应用对象。Illuminate\Support\Traits\Macroable的__call方法。 自己写一个简单的demo: <?php <?…...

基于python+vue的OA公文发文管理系统flask-django-php-nodejs

系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对OA公文发文管理的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的…...

脉冲变压器电感的工艺结构原理及选型参数总结

🏡《总目录》 目录 1,概述2,工作原理3,结构特点3.1,铁心结构3.2,铁心材料3.3,绕组4,工艺流程4.1,准备铁芯4.2,绕制线圈4.3,安装线圈4.4,固定线圈4.5,绝缘处理4.6,高压脉冲引出...

java中Arrays介绍及常用方法

在Java中&#xff0c;java.util.Arrays类是一个提供了各种操作数组的工具类。该类提供了一系列静态方法来对数组进行排序、搜索、填充、复制等操作。下面是对Arrays类的介绍以及常用方法的说明: toString()方法&#xff1a;将数组转换为字符串形式并返回&#xff0c;方便输出数…...

CTF题型 Http请求走私总结Burp靶场例题

CTF题型 Http请求走私总结&靶场例题 文章目录 CTF题型 Http请求走私总结&靶场例题HTTP请求走私HTTP请求走私漏洞原理分析为什么用前端服务器漏洞原理界定标准界定长度 重要!!!实验环境前提POST数据包结构必要结构快速判断Http请求走私类型时间延迟CL-TETE-CL 练习例题C…...

Nginx 的安装、启动和关闭

文章目录 一、背景说明二、Nginx 的安装2.1、依赖的安装2.2、Nginx 安装2.3、验证安装 三、启动 Nginx3.1、普通启动3.2、如何判断nginx已启动3.3、通过配置启动3.4、设置开机启动 四、关闭 Nginx4.1、优雅地关闭4.2、快速关闭4.3、只关闭主进程4.4、使用nginx关闭服务 五、重启…...

python 操作excel(openpyxl.load_workbook)、excel操作封装

操作excel 其他的库&#xff1a; xlrd xlwt &#xff1a; 过时了&#xff0c;只能操作xls后缀的文件。pandas&#xff1a;大数据测试 数据分析项目会用。 openpyxl&#xff1a;第三方库 支持的格式有&#xff1a;.xlsx、.xlsm、.xltx、.xltm&#xff0c;l不支持.xls文件格式…...

MySQL系统参数配置实战:生产环境优化

引言&#xff1a; MySQL作为广泛应用的关系型数据库&#xff0c;其系统参数配置直接影响着数据库的性能、稳定性以及资源利用率。本文旨在深入探讨MySQL的核心系统参数&#xff0c;并提供一份面向生产环境的配置建议&#xff0c;以帮助运维人员更好地优化数据库性能&#xff0…...

判断列表中每一个元素的个数

1.使用循环 nums [1, 1, 1, 2, 2, 3]# 构建一个空字典来存储元素和它们出现的次数 count_dict {}# 遍历列表&#xff0c;更新字典中每个元素出现的次数 for num in nums:if num in count_dict:count_dict[num] 1else:count_dict[num] 1# 输出统计结果 for num, count in c…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...

深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙

WebGL&#xff1a;在浏览器中解锁3D世界的魔法钥匙 引言&#xff1a;网页的边界正在消失 在数字化浪潮的推动下&#xff0c;网页早已不再是静态信息的展示窗口。如今&#xff0c;我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室&#xff0c;甚至沉浸式的V…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献

Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译&#xff1a; ### 胃肠道癌症的发病率呈上升趋势&#xff0c;且有年轻化倾向&#xff08;Bray等人&#xff0c;2018&#x…...