首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

CUBRID 學習筆記 17:事務回滾與 Savepoint 部分回滾實戰

     編輯:MySQL 綜合教學

CUBRID 學習筆記 17:事務回滾與 Savepoint 部分回滾實戰

基本回滾: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 部分回滾

在長事務中,可設定標記點,回滾到指定點而非整個事務。

語法

-- 設置保存點
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;

關鍵差異提示

  • CUBRID 支援 DDL 在事務中回滾(如 RENAME TABLE),這與 MySQL(DDL 隱式提交)顯著不同。
  • Savepoint 僅在當前事務有效,COMMIT 或 ROLLBACK(無 TO)會清除所有保存點。
  • 巢狀 Savepoint 允許,回滾到外層點會移除內層點。

適用場景

  1. 批量導入中間校驗失敗,回滾到上一批次。
  2. 2. 複雜業務流程中,某步驟可選,失敗不影響前序核心操作。 3. 測試腳本中,快速重置到特定狀態。

掌握 Savepoint,讓事務控制力更精細。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved