模块 11 · 第 1 课(共 4)课程中的41/57~15 min
模块课程(1/4)
ACID 事务(开始/提交)
任何数据库的可靠性基础都依赖于 ACID 首字母缩略词:
- Atomicity:操作要么完全完成(提交),要么失败,不留下半完成的痕迹(回滚)。
- C一致性:始终遵守数据库规则(例如约束、外键)。
- Isolation:同时发生的交易不会以不受控制的方式相互干扰。
- Durability:提交后,更改将不可逆地写入磁盘。
交易语法
通常,每个单个 UPDATE 或 DELETE 查询都被视为独立事务(自动提交)。但是,当您想要将多个操作组合在一起时,例如借记客户的帐户并下订单,您必须使用事务语法显式地执行此操作。
SQL
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO orders (user_id, total) VALUES (1, 100);
COMMIT; -- Writes the changes如果在这些复杂的执行过程中,发送查询的 JavaScript 应用程序意识到存在问题(例如仓库中没有足够的库存并且崩溃),它将发送:
SQL
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the block自己尝试一下
锻炼#sql.m11.l1.e1
尝试:0加载中...
打开交易。\n更新 ID 10 的产品,在临时表中将其“数量”设置为 0(不等,产品上没有“数量”,让我们发明一下:更改“order_items”中的“unit_price”,但这需要一个约束。\n让我们做得更好:将订单 ID 5 的状态更新为“已发货”并成功完成交易。
正在加载编辑器...
显示提示
以BEGIN;开始,将id=5的订单改为status='shipped',然后用COMMIT发送;
3 次尝试后可用的解决方案
锻炼#sql.m11.l1.e2
尝试:0加载中...
生产恐慌!开发人员编写了一个没有 WHERE 的 DELETE,历史上擦除了所有评论。\n让我们向他们展示如何完成回滚。启动一个事务,启动一个快速 DELETE,擦除“评论”中的所有内容(不带 WHERE 子句),然后在完成块之前使用 SQL 救星来消除影响。
正在加载编辑器...
显示提示
BEGIN;,从头开始删除“评论”,然后神奇的 ROLLBACK;在最后。
3 次尝试后可用的解决方案