了解 ACID 与 Transaction:别让你的数据库因基础错误而‘崩溃’!
Source: Dev.to
Transaction 是什么?
Transaction 是一组操作(读取、写入、更新、删除)的集合,被打包并作为单一逻辑单元来处理。它的目标是把数据库从一个合法状态转变为另一个合法状态。事务的生存原则是:要么完成它的所有操作,要么一个也不执行。
经典例子:从储蓄账户向活期账户转账。此操作包括两步:
- 从储蓄账户扣款。
- 向活期账户加款。
如果扣款成功后网络出错,未能及时加款怎么办?Transaction 会自动 rollback 整个过程,恢复储蓄账户的金额。
ACID 原则
| 成分 | 描述 |
|---|---|
| A – Atomicity(原子性) | 事务是一个不可分割的块。只有 开启(全部成功)或 关闭(全部撤销)两种状态。 |
| C – Consistency(一致性) | 事务必须把数据库从一个合法状态转变为另一个合法状态,遵守所有约束(主键、外键等)。 |
| I – Isolation(隔离性) | 并发执行的事务互不干扰或“踩踏”。每个事务的行为就像它是唯一正在运行的事务。 |
| D – Durability(持久性) | 当事务成功 commit 后,修改会永久写入磁盘,即使服务器掉电也不会丢失。 |
Transaction 的标准生命周期
- BEGIN TRANSACTION – 标记操作序列的起点。
- 执行 SQL 语句 – INSERT、UPDATE、DELETE(数据通常先写入缓冲区或日志)。
- COMMIT TRANSACTION – 若所有操作成功,将数据写入磁盘。
- ROLLBACK TRANSACTION – 若出现任何错误,撤销所有更改,使数据库恢复到之前的状态。
实际示例 (SQL)
START TRANSACTION;
UPDATE TaiKhoan SET SoDu = SoDu - 100000 WHERE ID = 'TK001';
UPDATE TaiKhoan SET SoDu = SoDu + 100000 WHERE ID = 'TK002';
-- Kiểm tra điều kiện (pseudo-code)
IF (Lỗi Xảy Ra) THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
何时应该使用 ACID?
- 金融与银行系统(转账、账本管理)。
- 电子商务(订单处理、库存管理)。
- 敏感数据管理系统(医疗记录、个人信息)。
- 核心业务应用(ERP、CRM)。
何时不应强行使用 ACID?
- 需要极高吞吐量和极低延迟的系统(日志分析、实时大数据处理)。
- 大规模分布式系统,因为在分布式集群上维护 ACID 非常复杂且耗资源。
NoSQL 中的 BASE 概念
BASE(Basically Available, Soft state, Eventually consistent)强调可用性和可扩展性,接受在短时间内数据不一致的情况。
例子:在社交网络上点击“赞”,点赞数的同步可能需要几秒钟才能在整个系统中统一——这是可以接受的(最终一致)。
结论
ACID 与 Transaction 是设计稳健系统的基础知识。掌握这些原理有助于做出正确的架构决策:何时需要严格的一致性(ACID),何时可以放宽以提升速度和扩展性(BASE)。
你是否遇到过因脏数据或 Transaction 设计错误导致的 bug?欢迎在评论区分享! 👇
🔥 想进一步学习数据库、SQL JOIN 或后端技术,欢迎访问 blog ITPrep 阅读更多实战干货!