产品概述
应用场景
产品架构
实例类型
兼容性说明
使用规范建议
SAVEPOINT savepoint_name;
ROLLBACK TO SAVEPOINT savepoint_name;
RELEASE SAVEPOINT savepoint_name;
参数 | 是否必选 | 说明 |
savepoint_name | 是 | 保存点的唯一名称标识,支持大小写英文字母、数字。 |
ERROR 1305 (42000): SAVEPOINT does not exist。-- 创建测试表CREATE TABLE account (id INT PRIMARY KEY,name VARCHAR(50),balance DECIMAL(10,2));-- 插入测试数据INSERT INTO account VALUES (1, 'Alice', 1000.00);INSERT INTO account VALUES (2, 'Bob', 500.00);
-- 开始事务BEGIN;-- 查看初始状态SELECT * FROM account WHERE id IN (1,2);-- Alice向Bob转账100元UPDATE account SET balance = balance - 100 WHERE id = 1;SELECT * FROM account WHERE id IN (1,2);-- 设置保存点sp1SAVEPOINT sp1;-- Bob收到100元UPDATE account SET balance = balance + 100 WHERE id = 2;SELECT * FROM account WHERE id IN (1,2);-- 设置保存点sp2SAVEPOINT sp2;-- 再次转账50元UPDATE account SET balance = balance - 50 WHERE id = 1;UPDATE account SET balance = balance + 50 WHERE id = 2;SELECT * FROM account WHERE id IN (1,2);-- 设置保存点sp3SAVEPOINT sp3;-- 回滚到sp2保存点(撤销第二次转账)ROLLBACK TO SAVEPOINT sp2;SELECT * FROM account WHERE id IN (1,2);-- 释放sp1保存点(删除sp1及之后的所有保存点)RELEASE SAVEPOINT sp1;-- 尝试回滚到sp3会失败(因为sp3已被删除)-- ROLLBACK TO SAVEPOINT sp3; -- 这行会报错-- 提交事务COMMIT;
-- 查询最终余额SELECT * FROM account;
+----+-------+---------+| id | name | balance |+----+-------+---------+| 1 | Alice | 900.00 || 2 | Bob | 600.00 |+----+-------+---------+
操作步骤 | Alice 余额 | Bob 余额 | 说明 |
初始状态 | 1000.00 | 500.00 | 事务开始前 |
第一次转账 | 900.00 | 500.00 | Alice 转出100元 |
设置 sp1 后 | 900.00 | 600.00 | Bob 收到100元 |
设置 sp2 后 | 850.00 | 650.00 | 再次转账50元 |
回滚到 sp2 | 900.00 | 600.00 | 撤销第二次转账 |
最终提交 | 900.00 | 600.00 | 事务完成 |
文档反馈