MySQL 事务
ACID、BEGIN/COMMIT/ROLLBACK,以及隔离级别。
Key Points事务把多个操作打包成「全成功或全失败」的原子单元,靠 InnoDB 实现。
ACID 是什么
- Atomicity 原子性 —— 要么全做,要么全不做
- Consistency 一致性 —— 数据始终满足约束
- Isolation 隔离性 —— 并发事务互不干扰
- Durability 持久性 —— 提交后不丢
基本流程
SQL
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- 都成功才提交
-- 出错时:ROLLBACK; 回滚到 BEGIN 之前Output
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 0 rows affected (0.01 sec)隔离级别
| 级别 | 可能问题 |
|---|---|
| READ UNCOMMITTED | 脏读 |
| READ COMMITTED | 不可重复读 |
| REPEATABLE READ(默认) | 幻读 |
| SERIALIZABLE | 无(串行,最慢) |
MySQL defaults to REPEATABLE READ with MVCC, enough for most cases. Use READ COMMITTED for 'see committed' semantics; SERIALIZABLE for strict consistency at a performance cost.
ACID 是什么
- Atomicity 原子性 —— 要么全做,要么全不做
- Consistency 一致性 —— 数据始终满足约束
- Isolation 隔离性 —— 并发事务互不干扰
- Durability 持久性 —— 提交后不丢
基本流程
SQL
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- 都成功才提交
-- 出错时:ROLLBACK; 回滚到 BEGIN 之前Output
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 0 rows affected (0.01 sec)隔离级别
| 级别 | 可能问题 |
|---|---|
| READ UNCOMMITTED | 脏读 |
| READ COMMITTED | 不可重复读 |
| REPEATABLE READ(默认) | 幻读 |
| SERIALIZABLE | 无(串行,最慢) |
MySQL 默认隔离级别是 REPEATABLE READ,配合 MVCC 多数场景够用。需要「读到别人已提交」用 READ COMMITTED;追求绝对一致用 SERIALIZABLE 但要接受性能下降。