在 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:
| 属性 | 全称 | 核心含义 |
|---|---|---|
| a | atomicity(原子性) | 事务是不可分割的最小单元,要么全成功,要么全失败 |
| c | consistency(一致性) | 事务执行前后,数据的完整性约束不变(如转账前后总金额不变) |
| i | isolation(隔离性) | 多个事务并发执行时,互不干扰,互不影响 |
| d | durability(持久性) | 事务提交后,数据永久写入数据库,不会丢失 |
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/begin→commit/rollback
2. 存储引擎核心
- innodb:默认引擎,支持事务、外键、行锁,适用于事务型业务
- myisam:不支持事务,读性能高,适用于读多写少场景
- 事务仅 innodb 支持,myisam 无事务能力
六、避坑指南
- 事务依赖存储引擎:只有 innodb 支持事务,myisam 执行事务语句不会报错,但不会生效
- 隔离级别设置:
set session仅对当前会话生效,全局设置需修改my.cnf - 幻读在 mysql 中的特殊处理:innodb 默认级别
repeatable read下,通过 mvcc 避免了幻读,与标准 sql 不同 - 事务回滚时机:必须在
commit之前执行,提交后无法回滚
到此这篇关于mysql事务与存储引擎全解(概念、原理、代码示例)的文章就介绍到这了,更多相关mysql事务与存储引擎内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论