【MySQL笔记】事务的ACID特性与隔离级别
目录
- 1. 什么是事务?
- 2. 事务的ACID特性
- 3. 事务控制语法
- 4. 隔离级别与并发问题
1. 什么是事务?
事务(Transaction)是由一组SQL语句组成的逻辑单元,这些操作要么全部成功,要么全部失败。
案例——银行转账:
转账成功: 张三给李四转100元,转账之前张三和李四的总额是1000+1000=2000,转账之后张三和李四的总额是900+1100=2000,这是正确的结果;
转账失败: 如果在转账的过程中张三的余额减了100 之后服务器崩溃了,李四的余额没有 加100,最终两个人的余额之和是900+1000=1900;
2. 事务的ACID特性
特性 | 说明 |
---|---|
原子性(Atomicity) | 事务内操作要么全成功,要么全失败 |
一致性(Consistency) | 事务前后数据完整性不变 (如转账总额守恒) |
隔离性(Isolation) | 并发事务相互隔离,防止数据干扰 |
持久性(Durability) | 事务提交后数据永久存储 |
3. 事务控制语法
-- 1. 开启事务(两种方式)
START TRANSACTION;
BEGIN;-- 2. 设置保存点
SAVEPOINT savepoint1;-- 3. 提交/回滚
COMMIT; -- 提交
ROLLBACK; -- 回滚
ROLLBACK TO savepoint1; -- 回滚到保存点-- 4. 自动提交设置
SET autocommit = 0; -- 关闭自动提交(默认=1开启)
注意:
- 已提交的事务不可回滚
- 自动提交模式下,一条SQL就是一个事务
- 显式开启事务时(
BEGIN
后),必须手动COMMIT
4. 隔离级别与并发问题
MySQL支持4种隔离级别 (从上到下安全性⬆️ 并发性(性能)⬇️) :
隔离级别 | 脏读 | 不可重复度 | 幻读 |
---|---|---|---|
READ UNCOMMITTED (读未提交) | ✅ | ✅ | ✅ |
READ COMMITTED (读已提交) | ❌ | ✅ | ✅ |
REPEATABLE READ (可重复度(默认)) | ❌ | ❌ | ✅ |
SERIALIZABLE (串行化) | ❌ | ❌ | ❌ |
MySQL 的 InnoDB 存储引擎中通过 Next-Key 锁部分解决幻读问题
- 脏读:事务 A 读取了事务 B 未提交的数据
- 例:B 修改数据中途崩溃,A 读到中间状态的数据
- 不可重复读:同事务内两次读取结果不同(数据值变化)
- 幻读 :想通的查询条件两次返回数据的行数不同
- 例:A 查询余额 >500 的账户,期间 B 新增满足条件的账户
生产建议:
MySQL 默认REPEATABLE READ
在多数场景下平衡性能与安全
金融系统可考虑SERIALIZABLE
,但需测试性能影响
谨慎使用READ UNCOMMITTED
(仅适用于可容忍脏读的场景)