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 存储引擎。已存在的表存储引擎不会被更改,在创建表时如果手动指定使用的存储引擎,则使用手动指定的存储引擎。

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

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

相关文章

element el-dialog里再调用其他组件,查找不到组件的方法

需求描述:点击编辑按钮,跳出编辑弹窗,回显图片组件里面的图片问题:element el-dialog里再调用组件,打开该弹窗的瞬间找不到弹窗里调用子组件的方法原因:弹窗显示时,调用的子组件还没渲染出来所以…

【机器学习入门 】支持向量机

系列文章目录 第1章 专家系统 第2章 决策树 第3章 神经元和感知机 识别手写数字——感知机 第4章 线性回归 第5章 逻辑斯蒂回归和分类 前言 支持向量机(Support Vector Machine) 于1995年发表,由于其优越的性能和广泛的适用性,成为机器学习的主流技术&…

阿里云有免费服务器吗?有的,附送免费服务器申请流程

阿里云服务器免费试用申请链接入口:aliyunfuwuqi.com/go/free 阿里云个人用户和企业用户均可申请免费试用,最高可以免费使用3个月,阿里云服务器网分享阿里云服务器免费试用申请入口链接及云服务器配置: 阿里云免费服务器领取 阿里…

Python:继承

注意:本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 ([www.aideeplearning.cn]) Python中的继承是面向对象编程(OOP)的一个基本特性,它允许一个类(称为子类)继承另一个…

string c++

#include<iostream> using namespace std; int main() { string a"wddw"; string b"wdwdwdwdwd"; string c b a; cout << c << endl; cout << c.length() << endl; string c_sub c.substr(2,2);//从第二个开…

day10_面向对象之封装丶构造器

封装概述 现实生活中&#xff0c;每一个个体与个体之间是有边界的&#xff0c;每一个团体与团体之间是有边界的&#xff0c;而同一个个体、团体内部的信息是互通的&#xff0c;只是对外有所隐瞒。 面向对象编程语言是对客观世界的模拟&#xff0c;客观世界里每一个事物的内部…

【MySQL】巧解客户连续递增交易

力扣题 1、题目地址 2701. 连续递增交易 2、模拟表 表&#xff1a;Transactions 字段名类型transaction_idintcustomer_idinttransaction_datedateamountint transaction_id 是该表的主键。每行包含有关交易的信息&#xff0c;包括唯一的 (customer_id, transaction_date…

总结: HQL语句

总结: HQL语句 Part1 数据库的操作Part2 数据表的操作1. 创建普通表2. 内外部表3. 内外部表转换 Part1 数据库的操作 查看数据库: show databases; 创建数据库: create database if not exists 数据库名 使用数据库: use 数据库名; 查看数据库详细信息: desc database 数据库名…

Echarts 利用多X轴实现未来15天天气预报

Echarts 利用多X轴实现未来15天天气预报 UI 设计图 Echarts 实现效果 代码实现 代码分解 echarts 图表上下均显示数据 通过设置 grid.top 和 grid.bottom 设置白天和夜间天气展示区域 grid: {top: 36%,bottom: 36%,left: 5%,right: 5%}, 天气图标的设置 由于 axisLabel 的…

【Linux】一文了解【进程优先级相关知识点】&【PRI / NI值】背后的修正原理(13)

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《…

算法 之 排序算法

&#x1f389;欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ &#x1f389;感谢各位读者在百忙之中抽出时间来垂阅我的文章&#xff0c;我会尽我所能向的大家分享我的知识和经验&#x1f4d6; &#x1f389;希望我们在一篇篇的文章中能够共同进步&#xff01;&#xff01;&…

实验7-2-10 简易连连看(PTA)

题目&#xff1a; 本题要求实现一个简易连连看游戏模拟程序。 给定一个2N2N的方阵网格游戏盘面&#xff0c;每个格子中放置一些符号。这些符号一定是成对出现的&#xff0c;同一个符号可能不止一对。程序读入玩家给出的一对位置(x1​,y1​)、(x2​,y2​)&#xff0c;判断这两…

leetcode(Hot100)——数组篇

1、两数之和 本题使用哈希法&#xff0c;用一个哈希Map保存数组的值以及对应下标&#xff0c;代码如下&#xff1a; class Solution {public int[] twoSum(int[] nums, int target) {HashMap<Integer,Integer> map new HashMap<>();for(int i0; i<nums.length…

【网络基础】网络层基本协议介绍

目录 一、IP数据包 1.1 网络层的功能 1.2 IP数据包格式 二、ICMP协议介绍 2.1 作用 2.2 常用命令 2.2.1 Ping命令 2.2.2 tracert命令 2.3 广播域 三、ARP协议介绍 3.1 作用 3.2 原理 一、IP数据包 1.1 网络层的功能 定义了基于IP协议的逻辑地址&#xff0c;就是I…

数据结构应用——哈夫曼树

哈夫曼树 哈夫曼树的相关概念构造哈夫曼树基础算法 哈夫曼编码 哈夫曼树的相关概念 结点的权&#xff1a;有某种现实含义的数值。结点的带权路径长度&#xff1a;从树的根结点到该结点的路径长度&#xff08;经过的边数&#xff09;与该结点上权值的乘积。树的带权路径长度&am…

CAPL (Communication Access Programming Language)

CAPL (Communication Access Programming Language) 是一种专门用于模拟和测试汽车网络的脚本语言&#xff0c;特别是CAN (Controller Area Network) 和LIN (Local Interconnect Network) 网络。虽然CAPL主要用于模拟网络行为和测试网络节点&#xff0c;但它也支持一些基本的编…

XiBe希贝奶瓶好用吗?2名宝宝的宝爸深度测评分享!

几乎每个新手宝爸宝妈都会有一段时间对孩子的很多东西都是不懂的&#xff0c;一边摸索一边学习。列如关于奶瓶这个问题就困扰不少新手爸妈&#xff0c;特别是面对这么多的品牌的奶瓶完全不知道怎么选。 相信很多新手爸妈都十分担心奶瓶材质安全问题&#xff0c;所以我作为一名…

OpenCV+OpenCV-Contrib源码编译

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、OpenCV是什么&#xff1f;二、OpenCV 源码编译1.前期准备1.1 源码下载1.2 cmake安装1.3 vscode 安装1.4 git 安装1.5 mingw安装 2.源码编译2.1 打开cmake2.…

python(django)之流程接口管理后台开发

1、在models.py中加入流程接口表和单一接口表 代码如下&#xff1a; from django.db import models from product.models import Product# Create your models here.class Apitest(models.Model):apitestname models.CharField(流程接口名称, max_length64)apitester model…

Python学习笔记07

第十三章&#xff0c;面向对象 初识对象 生活中数据的组织 学校开学&#xff0c;要求学生填写自己的基础信息&#xff0c;一人发一张白纸&#xff0c;让学生自己填 我叫林军杰&#xff0c;今年31岁.来自山东省&#xff0c;我是男的&#xff0c;中国人 内容混乱 改为登记表…