Mysql事务与存储引擎全解(概念、原理、代码示例)

 更新时间:2026年04月10日 10:07:07   作者:羊小蜜.  
本文讲解了MySQL事务与存储引擎的相关知识点,围绕图片中的知识点,从概念、原理、代码示例三个维度,带你彻底掌握 MySQL 事务与存储引擎,感兴趣的朋友跟随小编一起看看吧

在 MySQL 中,事务是保证数据一致性的核心机制,存储引擎则是 MySQL 处理数据的底层引擎,两者是数据库开发、面试的高频考点。本文围绕图片中的知识点,从概念、原理、代码示例三个维度,带你彻底掌握 MySQL 事务与存储引擎。

一、核心知识点总览

大类细分知识点核心作用
事务基础1. 事务引例理解事务的实际应用场景
2. 相关概念事务的定义、执行流程
3. 存储引擎事务与存储引擎的依赖关系
4. ACID 属性事务的四大核心特性(面试必背)
5. 银行转账演示事务的实际代码实战
事务并发与隔离6. 事务的并发问题脏读、不可重复读、幻读
7. 事务隔离性四大隔离级别
8. 隔离级别总结隔离级别对比、MySQL 默认级别
9. 隔离级别演示不同隔离级别下的问题演示
存储引擎10. 存储引擎InnoDB、MyISAM 等核心引擎对比

二、一、事务基础:从概念到 ACID

1. 事务是什么?

事务(Transaction)是一组不可分割的 SQL 操作单元,要么全部执行成功,要么全部执行失败,保证数据的一致性。

经典场景:银行转账(A 给 B 转钱,A 扣钱和 B 加钱必须同时成功 / 失败)

2. 事务的执行流程

-- 开启事务
START TRANSACTION;  -- 或 BEGIN;
-- 执行SQL操作
UPDATE account SET money = money - 100 WHERE name = 'A';
UPDATE account SET money = money + 100 WHERE name = 'B';
-- 提交事务(全部生效)
COMMIT;
-- 回滚事务(全部撤销,出现异常时执行)
ROLLBACK;

3. 事务的 ACID 属性

事务必须满足四大核心特性,简称 ACID

属性全称核心含义
AAtomicity(原子性)事务是不可分割的最小单元,要么全成功,要么全失败
CConsistency(一致性)事务执行前后,数据的完整性约束不变(如转账前后总金额不变)
IIsolation(隔离性)多个事务并发执行时,互不干扰,互不影响
DDurability(持久性)事务提交后,数据永久写入数据库,不会丢失

4. 银行转账的事务演示(代码实战)

准备工作:创建账户表

CREATE TABLE account (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    money DECIMAL(10,2) NOT NULL
) ENGINE=InnoDB; -- 必须用InnoDB(支持事务)
INSERT INTO account (name, money) VALUES
('A', 1000.00),
('B', 500.00);

事务转账代码

-- 开启事务
START TRANSACTION;
-- A扣100
UPDATE account SET money = money - 100 WHERE name = 'A';
-- 模拟异常(手动报错,测试回滚)
-- SELECT 1/0;
-- B加100
UPDATE account SET money = money + 100 WHERE name = 'B';
-- 提交事务
COMMIT;
-- 若出现异常,执行回滚
-- ROLLBACK;
-- 查看结果
SELECT * FROM account;

结果说明

  • 正常执行:A 余额 900,B 余额 600,总金额 1500 不变(一致性)
  • 异常回滚:两条 UPDATE 全部撤销,A、B 余额不变(原子性)

三、二、事务并发问题与隔离级别

1. 事务的三大并发问题

多个事务同时操作同一数据时,会出现以下问题:

问题核心含义危害
脏读一个事务读取了另一个事务未提交的数据,后续该事务回滚,读取的数据无效读取到错误数据
不可重复读一个事务内两次读取同一数据,中间被另一个事务修改,两次读取结果不一致同一事务内数据不一致
幻读一个事务内两次查询同一范围数据,中间被另一个事务插入 / 删除数据,两次查询结果行数不一致数据行数不一致,像 “幻觉”

2. 四大事务隔离级别(解决并发问题)

MySQL 通过隔离级别控制事务的隔离程度,级别越高,并发问题越少,但性能越低:

隔离级别英文解决的问题脏读不可重复读幻读MySQL 默认
读未提交READ UNCOMMITTED最低级别,无隔离✅ 存在✅ 存在✅ 存在
读已提交READ COMMITTED仅读取已提交数据❌ 避免✅ 存在✅ 存在否(Oracle 默认)
可重复读REPEATABLE READ同一事务内数据重复读取一致❌ 避免❌ 避免✅ 存在(MySQL 特殊优化)✅ 是(MySQL 默认)
串行化SERIALIZABLE事务串行执行,完全隔离❌ 避免❌ 避免❌ 避免

MySQL 特殊说明:InnoDB 在 REPEATABLE READ 级别下,通过 MVCC(多版本并发控制) 避免了幻读,是 MySQL 的默认级别,兼顾性能与一致性。

3. 隔离级别演示(核心场景)

(1)读未提交(READ UNCOMMITTED):脏读演示

-- 事务1:开启事务,修改数据但不提交
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
START TRANSACTION;
UPDATE account SET money = 900 WHERE name = 'A';
-- 事务2:读取A的余额(读到了未提交的数据,脏读)
START TRANSACTION;
SELECT money FROM account WHERE name = 'A'; -- 结果:900
-- 事务1:回滚
ROLLBACK;
-- 事务2:再次读取,结果变回1000(脏读导致数据不一致)
SELECT money FROM account WHERE name = 'A'; -- 结果:1000

(2)读已提交(READ COMMITTED):不可重复读演示

-- 事务1:开启事务
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
-- 第一次读取A的余额
SELECT money FROM account WHERE name = 'A'; -- 结果:1000
-- 事务2:修改并提交
START TRANSACTION;
UPDATE account SET money = 900 WHERE name = 'A';
COMMIT;
-- 事务1:第二次读取,结果变为900(不可重复读)
SELECT money FROM account WHERE name = 'A'; -- 结果:900

(3)可重复读(REPEATABLE READ):避免不可重复读,幻读演示

-- 事务1:开启事务(默认级别)
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
-- 第一次查询余额>800的记录
SELECT * FROM account WHERE money > 800; -- 结果:A(1000)
-- 事务2:插入新记录并提交
START TRANSACTION;
INSERT INTO account (name, money) VALUES ('C', 900.00);
COMMIT;
-- 事务1:第二次查询,结果仍为A(1000)(MySQL MVCC避免幻读)
SELECT * FROM account WHERE money > 800;
-- 若手动关闭MVCC,会出现幻读(第二次查询出现C的记录)

(4)串行化(SERIALIZABLE):完全避免所有问题

-- 事务1:开启串行化隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION;
SELECT * FROM account;
-- 事务2:尝试修改数据,会被阻塞,直到事务1提交/回滚
START TRANSACTION;
UPDATE account SET money = 900 WHERE name = 'A'; -- 阻塞

四、三、存储引擎详解

1. 什么是存储引擎?

存储引擎是 MySQL 处理数据的底层组件,负责数据的存储、提取、事务管理等,MySQL 支持多种存储引擎,不同引擎特性不同。

2. 核心存储引擎对比(面试必背)

存储引擎事务支持外键支持锁粒度适用场景
InnoDB✅ 支持✅ 支持行级锁事务型业务(如银行、电商),MySQL 5.5+ 默认引擎
MyISAM❌ 不支持❌ 不支持表级锁读多写少的场景(如日志、报表),不支持事务
Memory❌ 不支持❌ 不支持表级锁临时表、缓存,数据存储在内存中,重启丢失
Archive❌ 不支持❌ 不支持行级锁归档存储,高压缩比,仅支持插入 / 查询

3. 存储引擎相关操作

-- 查看MySQL支持的存储引擎
SHOW ENGINES;
-- 查看表的存储引擎
SHOW TABLE STATUS LIKE 'account';
-- 修改表的存储引擎
ALTER TABLE account ENGINE = MyISAM;
-- 创建表时指定存储引擎
CREATE TABLE test (
    id INT PRIMARY KEY
) ENGINE=InnoDB;

4. InnoDB 核心特性

  • 支持事务、外键、行级锁、MVCC
  • 支持崩溃恢复,保证数据安全
  • 是 MySQL 生产环境的首选引擎

五、核心总结(面试速记)

1. 事务核心

  • ACID:原子性、一致性、隔离性、持久性
  • 并发问题:脏读、不可重复读、幻读
  • 隔离级别:读未提交 → 读已提交 → 可重复读(MySQL 默认) → 串行化
  • 事务语法START TRANSACTION / BEGINCOMMIT / ROLLBACK

2. 存储引擎核心

  • InnoDB:默认引擎,支持事务、外键、行锁,适用于事务型业务
  • MyISAM:不支持事务,读性能高,适用于读多写少场景
  • 事务仅 InnoDB 支持,MyISAM 无事务能力

六、避坑指南

  1. 事务依赖存储引擎:只有 InnoDB 支持事务,MyISAM 执行事务语句不会报错,但不会生效
  2. 隔离级别设置SET SESSION 仅对当前会话生效,全局设置需修改 my.cnf
  3. 幻读在 MySQL 中的特殊处理:InnoDB 默认级别 REPEATABLE READ 下,通过 MVCC 避免了幻读,与标准 SQL 不同
  4. 事务回滚时机:必须在 COMMIT 之前执行,提交后无法回滚

到此这篇关于Mysql事务与存储引擎全解(概念、原理、代码示例)的文章就介绍到这了,更多相关mysql事务与存储引擎内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈MySQL中优化sql语句查询常用的30种方法

    浅谈MySQL中优化sql语句查询常用的30种方法

    本篇文章是对MySQL中优化sql语句查询常用的30种方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MySQL  zip安装包配置教程

    MySQL  zip安装包配置教程

    这篇文章详细介绍了如何使用zip安装包在Windows11上安装MySQL8.0,包括下载、解压、配置环境变量、初始化数据库、安装服务以及更改密码等步骤,感兴趣的朋友一起看看吧
    2025-02-02
  • C#实现MySQL命令行备份和恢复

    C#实现MySQL命令行备份和恢复

    MySQL数据库的备份有很多工具可以使用,今天介绍一下使用C#调用MYSQL的mysqldump命令完成MySQL数据库的备份与恢复
    2018-03-03
  • Mysql修改存储过程相关权限问题

    Mysql修改存储过程相关权限问题

    这篇文章主要介绍了Mysql修改存储过程相关权限问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 使用MySQL从JSON字符串提取数据的方法详解

    使用MySQL从JSON字符串提取数据的方法详解

    在现代数据库管理中,JSON 格式因其灵活性而广泛使用,然而,当数据存储在 JSON 中时,我们经常需要将其转换为更易于处理的格式,本篇文章将通过一个具体的 SQL 查询示例,展示如何从存储在 MySQL 中的 JSON 字符串提取数据并重新格式化,需要的朋友可以参考下
    2024-10-10
  • mysql中TIMESTAMPDIFF案例详解

    mysql中TIMESTAMPDIFF案例详解

    这篇文章主要介绍了mysql中TIMESTAMPDIFF案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • MySQL密码忘记了5分钟快速找回全攻略(附详细图解)

    MySQL密码忘记了5分钟快速找回全攻略(附详细图解)

    这篇文章主要介绍了MySQL密码忘记了5分钟快速找回的相关资料,适用于Windows和Mac系统,通过跳过权限验证进入无密码模式,然后修改root密码并恢复权限验证,需要的朋友可以参考下
    2026-01-01
  • MySQL连表更新实现高效数据同步的实战指南

    MySQL连表更新实现高效数据同步的实战指南

    在数据库开发中,连表更新(JOIN UPDATE)是一种常见且强大的操作,它允许我们基于关联表的数据来更新目标表,本文将深入探讨MySQL连表更新的语法、应用场景、性能优化及常见陷阱,帮助开发者掌握这一核心技能,需要的朋友可以参考下
    2026-02-02
  • mysql 5.7.25 压缩版安装配置方法图文教程

    mysql 5.7.25 压缩版安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 5.7.25 压缩版安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • MySQL事件与触发器专题精炼

    MySQL事件与触发器专题精炼

    触发器是SQLserver提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,事件是在 MySQL 5.1后引入的,有点类似操作系统的计划任务,但是周期性任务是内置在MySQL服务端执行的
    2022-03-03

最新评论