MySQL 事务
MySQL 事务
事务是 MySQL 中保证数据原子性、一致性、隔离性、持久性(ACID) 的核心机制,主要用于处理多步操作组成的业务场景(如转账、订单创建等),避免因中间步骤失败导致数据混乱。
事务的 ACID 特性
| 特性 | 核心含义 |
|---|---|
| 原子性(Atomicity) | 事务中的所有操作“要么全部成功,要么全部失败回滚”,无中间状态。 |
| 一致性(Consistency) | 事务执行前后,数据库的完整性约束(如主键唯一、外键关联)不被破坏。 |
| 隔离性(Isolation) | 多个事务并发执行时,一个事务的操作不会被其他事务干扰,各事务看到的数据独立。 |
| 持久性(Durability) | 事务一旦提交,修改的数据会永久保存到磁盘,即使数据库崩溃也不会丢失。 |
事务的常见操作
-- 1. 开启事务(默认自动提交关闭)
START TRANSACTION; -- 或 BEGIN;
-- 2. 执行业务操作(如转账:A账户减100,B账户加100)
UPDATE account SET balance = balance - 100 WHERE id = 1; -- A账户
UPDATE account SET balance = balance + 100 WHERE id = 2; -- B账户
-- 3. 提交事务(成功时,永久生效)
COMMIT;
-- 4. 回滚事务(失败时,撤销所有操作)
ROLLBACK;
-- 可选:设置保存点(部分回滚)
SAVEPOINT sp1; -- 创建保存点sp1
UPDATE account SET balance = balance - 50 WHERE id = 1; -- 额外操作
ROLLBACK TO sp1; -- 回滚到sp1,仅撤销“减50”的操作,保留“减100”的操作
事务隔离级别(解决并发问题)
MySQL 支持 4 种隔离级别,默认级别为 Repeatable Read(可重复读),不同级别对并发问题的解决能力不同:
| 隔离级别 | 脏读(读未提交) | 不可重复读(读已提交) | 幻读(批量读不一致) | 并发性能 |
|---|---|---|---|---|
| Read Uncommitted | 允许 | 允许 | 允许 | 最高 |
| Read Committed | 禁止 | 允许 | 允许 | 较高 |
| Repeatable Read | 禁止 | 禁止 | 禁止(MySQL 特有优化) | 中等 |
| Serializable | 禁止 | 禁止 | 禁止 | 最低 |
- 脏读:一个事务读取到另一个事务未提交的修改(如 A 转账给 B,未提交时 B 看到余额增加,后 A 回滚,B 看到的是“脏数据”);
- 不可重复读:同一事务内多次读取同一数据,结果不一致(如 A 事务读 B 余额为 100,B 事务修改余额为 200 并提交,A 事务再次读时变为 200);
- 幻读:同一事务内多次执行批量查询,结果行数不一致(如 A 事务统计账户数为 10,B 事务新增一个账户并提交,A 事务再次统计变为 11)。

浙公网安备 33010602011771号