MySQL 事务ACID特性
事务是数据库操作的基本单位,ACID 特性保证数据操作的可靠性和一致性。
ACID 四大特性
| 特性 | 英文 | 说明 |
|---|---|---|
| 原子性 | Atomicity | 事务不可分割,要么全做要么全不做 |
| 一致性 | Consistency | 事务前后数据状态一致 |
| 隔离性 | Isolation | 并发事务之间相互隔离 |
| 持久性 | Durability | 事务提交后永久保存 |
原子性 Atomicity
SQL
-- 事务要么全部成功,要么全部失败
START TRANSACTION;
-- 转账操作:A账户扣款,B账户加款
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- 如果任何一步失败,整个事务回滚
COMMIT; -- 全部成功,提交
-- 或 ROLLBACK; -- 失败时回滚
原子性通过 Undo Log 实现:
- 事务执行前记录数据旧值
- 回滚时根据 Undo Log 恢复原数据
一致性 Consistency
SQL
-- 转账前后总金额不变
-- 假设 A 有 500,B 有 300,总额 800
START TRANSACTION;
UPDATE accounts SET balance = 400 WHERE id = 1; -- A扣100
UPDATE accounts SET balance = 400 WHERE id = 2; -- B加100
COMMIT;
-- 总额仍为 800,保持一致
一致性保障:
- 数据库约束(主键、外键、唯一等)
- 应用层逻辑校验
- 原子性 + 隔离性 共同保证
隔离性 Isolation
SQL
-- 设置隔离级别
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- 查看当前隔离级别
SELECT @@transaction_isolation;
| 隔离级别 | 说明 | 问题 |
|---|---|---|
| READ UNCOMMITTED | 读未提交 | 脏读、不可重复读、幻读 |
| READ COMMITTED | 读已提交 | 不可重复读、幻读 |
| REPEATABLE READ | 可重复读 | 幻读 |
| SERIALIZABLE | 序列化 | 无问题,性能最低 |
隔离性通过 锁机制 和 MVCC 实现。
持久性 Durability
SQL
-- 事务提交后,数据永久保存
START TRANSACTION;
INSERT INTO orders VALUES (1, '商品A', 100);
COMMIT; -- 提交后即使断电数据也不丢失
持久性通过 Redo Log 实现:
- 事务提交时先写 Redo Log
- 数据库崩溃后可根据 Redo Log 恢复
事务控制语句
SQL
-- 开启事务
START TRANSACTION;
BEGIN;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
-- 设置保存点
SAVEPOINT sp1;
ROLLBACK TO sp1; -- 回滚到保存点
默认情况下 MySQL 自动提交(autocommit=1),需手动开启事务。
要点总结
- 原子性:事务不可分割,Undo Log 保证回滚
- 一致性:数据状态前后一致,约束+逻辑保证
- 隔离性:并发事务隔离,锁+MVCC 实现
- 持久性:提交后永久保存,Redo Log 保证恢复
📝 发现内容有误?点击此处直接编辑