2024-03-02 13:26:30
ROLLBACK在SQL中用于撤销未提交的事务操作,将数据库恢复到事务开始前的状态,是保障数据完整性的关键机制。 以下是详细说明与实例演示:
一、ROLLBACK的核心作用事务流程分为四步:
成功时:COMMIT; 永久保存更改。
失败时:ROLLBACK; 撤销所有未提交操作。
示例场景:从账户A转账到账户B,若目标账户不存在则回滚。
-- 创建账户表CREATE TABLE accounts ( id INT PRIMARY KEY, account_name VARCHAR(255), balance DECIMAL(10, 2));-- 插入初始数据INSERT INTO accounts (id, account_name, balance) VALUES (1, 'Alice', 100.00), (2, 'Bob', 50.00);-- 事务开始START TRANSACTION;-- 从Alice账户扣款UPDATE accounts SET balance = balance - 30.00 WHERE id = 1;-- 模拟错误:尝试向不存在的账户转账(ID=3)-- UPDATE accounts SET balance = balance + 30.00 WHERE id = 3; -- 正确操作:向Bob账户转账(ID=2)UPDATE accounts SET balance = balance + 30.00 WHERE id = 2;-- 回滚事务(若上述错误未注释,执行此句会撤销所有更改)ROLLBACK;-- 查看结果(数据恢复至事务前状态)SELECT * FROM accounts;结果:Alice余额仍为100.00,Bob余额仍为50.00,表明ROLLBACK成功撤销了未提交的转账操作。

SQL标准不支持嵌套事务,但可通过SAVEPOINT实现部分回滚:
START TRANSACTION;-- 操作1:Alice扣款10元UPDATE accounts SET balance = balance - 10 WHERE id = 1;-- 设置保存点SAVEPOINT sp1;-- 操作2:Bob加款10元(可能失败)UPDATE accounts SET balance = balance + 10 WHERE id = 2;-- 若操作2失败,回滚到sp1(仅撤销操作2)ROLLBACK TO sp1;-- 提交剩余操作COMMIT;结果:Alice余额减少10元,Bob余额不变,实现了事务的部分撤销。
2. 死锁自动回滚当两个事务互相等待对方释放锁时,数据库会选择其中一个回滚:
事务应短小精悍,避免长时间持有锁。
复杂逻辑使用SAVEPOINT实现精细控制。
通过索引和事务设计减少死锁概率。
通过合理使用ROLLBACK,可显著提升数据库操作的可靠性与数据一致性。