ROLLBACK [WORK]
當 DML 執行報錯(如欄位不存在)時,整個事務需回滾:
-- 錯誤示範:s_name 不存在
ALTER TABLE code DROP s_name;
INSERT INTO code (s_name, f_name) VALUES ('D','Diamond');
-- ERROR: s_name is not defined.
-- 回滾修復
ROLLBACK WORK;
-- 修正後重新執行
ALTER TABLE code DROP s_name;
INSERT INTO code (f_name) VALUES ('Diamond');
COMMIT WORK;
在長事務中,可設定標記點,回滾到指定點而非整個事務。
-- 設置保存點
SAVEPOINT mark_name;
-- 回滾到保存點(保留 mark_name 之前的操作)
ROLLBACK [WORK] TO [SAVEPOINT] mark_name;
mark_name 可為 SQL 標識符或主機變數(以 : 開頭)。
CREATE TABLE athlete2 (name VARCHAR(40), gender CHAR(1), nation_code CHAR(3), event VARCHAR(30));
INSERT INTO athlete2(name, gender, nation_code, event)
VALUES ('Lim Kye-Sook', 'W', 'KOR', 'Hockey');
SAVEPOINT SP1; -- 標記 1
SELECT * FROM athlete2;
INSERT INTO athlete2(name, gender, nation_code, event)
VALUES ('Lim Jin-Suk', 'M', 'KOR', 'Handball');
SAVEPOINT SP2; -- 標記 2
SELECT * FROM athlete2;
RENAME TABLE athlete2 AS sportsman; -- DDL 會隱式提交?CUBRID 支援 DDL 回滾
SELECT * FROM sportsman;
ROLLBACK WORK TO SP2; -- 重命名被回滾,表名恢復 athlete2
SELECT * FROM athlete2;
DELETE FROM athlete2 WHERE name = 'Lim Jin-Suk';
SELECT * FROM athlete2;
ROLLBACK WORK TO SP2; -- 刪除被回滾
SELECT * FROM athlete2;
ROLLBACK WORK TO SP1; -- 回滾到最初,僅剩第一條記錄
SELECT * FROM athlete2;
COMMIT WORK;
RENAME TABLE),這與 MySQL(DDL 隱式提交)顯著不同。COMMIT 或 ROLLBACK(無 TO)會清除所有保存點。掌握 Savepoint,讓事務控制力更精細。