【MySQL笔记】事务的ACID特性与隔离级别

发布于:2025-07-14 ⋅ 阅读:(13) ⋅ 点赞:(0)

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 锁部分解决幻读问题,比如有20条数据,如果我正在修改第15条数据,那么第 1 - 15 条数据之间是被锁住不允许插入内容的,但是 Next-Key 锁只能锁住前边,不能锁住后边,所以说是解决部分幻读问题

  1. 脏读:事务 A 读取了事务 B 未提交的数据
    • 例:B 修改数据中途崩溃,A 读到中间状态的数据,那么 A 读到的就是没有提交的垃圾数据
  2. 不可重复读:同事务内两次读取结果不同(数据值变化
    事务A DB 事务B 读取数据X=100 修改X=200并提交 再次读取X=200 事务A DB 事务B
  3. 幻读 :相同的查询条件两次返回数据的行数不同
    • 例:A 查询余额 >500 的账户,期间 B 新增满足条件的账户

生产建议:
MySQL 默认 REPEATABLE READ 在多数场景下平衡性能与安全
金融系统可考虑 SERIALIZABLE ,但需测试性能影响
谨慎使用 READ UNCOMMITTED(仅适用于可容忍脏读的场景)


网站公告

今日签到

点亮在社区的每一天
去签到