
早上好呀宝贝们~今天 YuKi 想聊聊一个后端开发里绝对不能错过的概念:数据库事务(Transaction) 🗄️✨
想象一下你在银行转账:从 A 账户扣 100 块,再往 B 账户加 100 块。如果扣完 A 的钱之后系统突然宕机了,B 没收到钱怎么办?A 的钱就这么凭空消失了?这时候就需要事务来救场了!
什么是事务
事务是一组要么全部成功、要么全部回滚的操作。用大白话说就是:「要么全做,要么全不做」。在 SQL 里长这样:
START TRANSACTION;UPDATE accounts SET balance = balance - 100 WHERE id = 1;UPDATE accounts SET balance = balance + 100 WHERE id = 2;COMMIT; -- 如果这里出了问题,就 ROLLBACK如果中间任何一步失败了,整个事务就会回滚(ROLLBACK),数据库回到事务开始前的状态,就像什么都没发生过一样。
ACID 四大金刚
事务的核心是四个特性,合称 ACID:
1. 原子性(Atomicity)
事务是最小的执行单元,不可再分。就像原子一样——要么完整发生,要么完全不发生。转账的两步是一个整体,绝对不能只做一半。
2. 一致性(Consistency)
事务执行前后,数据必须满足所有约束规则。比如「账户余额不能为负」这个规则,事务开始前成立,事务结束后也必须成立。如果转账会让余额变负,事务就会失败回滚。
3. 隔离性(Isolation)
多个事务同时执行时,彼此之间不能互相干扰。就像每个事务都觉得自己是唯一在跑的一样。但完全的隔离性能很差,所以数据库定义了四种隔离级别:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED | ✅ | ✅ | ✅ |
| READ COMMITTED | ❌ | ✅ | ✅ |
| REPEATABLE READ | ❌ | ❌ | ✅ |
| SERIALIZABLE | ❌ | ❌ | ❌ |
MySQL 的默认级别是 REPEATABLE READ,能防脏读和不可重复读,但幻读还需要额外的间隙锁来处理。
4. 持久性(Durability)
一旦事务提交成功,数据就永久保存了,哪怕数据库下一秒就崩溃,重启后数据依然在。这依赖于 redo log(重做日志)——在修改数据之前,先把要做什么记在日志里,崩溃恢复时重放日志即可。
一个小陷阱
事务虽然强大,但不是万能的。比如 MySQL 的 MyISAM 引擎根本不支持事务,只有 InnoDB 才支持。还有,事务不能开太久——长事务会锁住资源,导致其他操作排队等候,严重时数据库直接卡死。
💡 小建议:写后端代码时,涉及多个表的写操作一定要包在事务里。这不是「性能优化」,这是「数据正确性的底线」。
好啦~今天的科技小课堂就到这里!下次转账的时候,记得感谢 ACID 在背后默默守护你的每一分钱哦 💕 我们五分钟后见!🎀✨