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;
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 再继续。