my+MySQL Atlas数据库学习图谱
官方手册 ↗
LEARN BY QUERYING · MYSQL 8.4

让每一条 SQL
都有清晰的答案。

让更新保持一致

理解回滚、保存点和锁定读,为并发操作建立边界。

示例数据查询结果动手练习
ONE DATASET, MANY QUESTIONS

准备你的练习数据 4 位客户 · 5 笔订单

+

在自己的空白练习数据库中执行。每项示例都基于初始数据独立验证;事务课程会改变数据,再次练习时请使用新的空白数据库。金额采用 DECIMAL,表使用 InnoDB。

建表与示例数据
CREATE TABLE customers (
  id INT PRIMARY KEY,
  name VARCHAR(40) NOT NULL,
  nickname VARCHAR(40) NULL
) ENGINE=InnoDB;
CREATE TABLE orders (
  id INT PRIMARY KEY,
  customer_id INT NOT NULL,
  amount DECIMAL(10,2) NOT NULL,
  status VARCHAR(20) NOT NULL,
  ordered_at DATE NOT NULL,
  FOREIGN KEY (customer_id) REFERENCES customers(id)
) ENGINE=InnoDB;
INSERT INTO customers VALUES
  (1, 'Ada', 'ada'), (2, 'Linus', NULL),
  (3, 'Grace', 'grace'), (4, 'Guido', NULL);
INSERT INTO orders VALUES
  (1, 1, 120.00, 'paid', '2026-01-02'),
  (2, 1, 80.00, 'paid', '2026-01-05'),
  (3, 2, 200.00, 'pending', '2026-01-06'),
  (4, 2, 50.00, 'paid', '2026-01-07'),
  (5, 3, 150.00, 'paid', '2026-01-09');
下载 dataset.sql ↓
THE PRACTICE

事务与锁 03

结果基于统一数据集;计划与锁行为需结合实际环境
01MySQL 8.0 · MySQL 8.4

用事务回滚整组更新

把多步操作放进事务,失败时回滚,避免只完成一半。

常见做法每条 UPDATE 自动提交,出错后再尝试人工恢复。

注意事项

示例使用 InnoDB;DDL 可能隐式提交。ROLLBACK 不能撤销已经提交的事务。

官方依据 ↗核对于 2026-10-06
SQL
START TRANSACTION;
UPDATE orders SET amount = 0 WHERE id = 1;
ROLLBACK;
SELECT amount FROM orders WHERE id = 1;

示例结果

amount
120.00

动手练习

把 ROLLBACK 改成 COMMIT,结果有什么变化?

查看参考答案 +

金额会保留为 0.00;重新初始化练习数据后再做其他练习。

02MySQL 8.0 · MySQL 8.4

保存点撤销局部操作

保留第一步金额修改,只撤销保存点之后的错误更新。

常见做法整个事务回滚后重新执行已成功的步骤。

注意事项

ROLLBACK TO 不结束事务;仍需 COMMIT 或完整 ROLLBACK。示例会提交数据变化,下次练习请重建数据。

官方依据 ↗核对于 2026-10-06
SQL
START TRANSACTION;
UPDATE orders SET amount = 130 WHERE id = 1;
SAVEPOINT after_first;
UPDATE orders SET amount = 999 WHERE id = 2;
ROLLBACK TO SAVEPOINT after_first;
COMMIT;
SELECT id, amount FROM orders
WHERE id IN (1, 2) ORDER BY id;

示例结果

idamount
1130.00
280.00

动手练习

如果最后执行完整 ROLLBACK,订单 1 是多少?

查看参考答案 +

恢复为初始金额 120.00。

03MySQL 8.0 · MySQL 8.4

用 FOR UPDATE 锁定读

在事务内读取准备修改的记录,再完成修改,直到提交后释放相关锁。

常见做法先普通 SELECT,再 UPDATE;两步之间另一个事务可能改变记录。

注意事项

单会话结果只能演示读写流程,不能证明阻塞或隔离效果。范围、索引和隔离级别会影响锁;事务尽量短。

官方依据 ↗核对于 2026-10-06
SQL
START TRANSACTION;
SELECT amount FROM orders WHERE id = 1 FOR UPDATE;
UPDATE orders SET amount = amount + 10 WHERE id = 1;
COMMIT;
SELECT amount FROM orders WHERE id = 1;

示例结果

amount
120.00
130.00

动手练习

在两个终端中,观察事务未提交时另一个会话更新同一订单的行为。

查看参考答案 +

会话 A 开启事务并 FOR UPDATE;会话 B 更新同一主键通常等待。A 提交或回滚后,B 再继续。

FROM THE SOURCE

版本与官方更新

自动检查官方发布索引;中文课程由维护者核对更新。