Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql事务与存储引擎

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

作者:羊小蜜.

本文讲解了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;

结果说明

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

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 核心特性

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

1. 事务核心

2. 存储引擎核心

六、避坑指南

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

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

您可能感兴趣的文章:
阅读全文