首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 事務處理核心機制:DML 隱式/顯式提交、SAVEPOINT 部分回滾與讀一致性保障

     編輯:Oracle 資料庫相關知識

事務定義

兩次連續成功的 COMMIT 或 ROLLBACK 之間的操作序列。事務內修改原子提交或撤銷,故障時自動回滾。

語句分類與事務邊界

  • DML (SELECT/INSERT/UPDATE/DELETE/MERGE):產生事務,修改緩存在 Undo 段,COMMIT 確認前其他會話不可見。
  • DDL (CREATE/ALTER/DROP/TRUNCATE):隱式提交 當前事務,再執行 DDL,再隱式提交。
  • DCL (GRANT/REVOKE):同 DDL,隱式提交。

結論:只有 DML 可構建事務,DDL/DCL 會強制切斷事務邊界。

銀行轉賬例說明 ACID

  1. 從帳戶 A 扣款 1000 (UPDATE accounts SET bal=bal-1000 WHERE id='A')。
  2. 向帳戶 B 存入 1000 (UPDATE accounts SET bal=bal+1000 WHERE id='B')。
  3. 若步驟 2 失敗 (如 B 鎖定)、系統崩潰、網絡中斷 → 整個事務回滾,A 餘額不變。
  4. COMMIT 後其他會話才能查見新餘額,實現讀一致性 (Statement-Level Read Consistency)。

事務生命週期

  • 開始:首條 DML 執行 → 分配可用 Undo 段記錄回滾信息。
  • 結束:COMMIT (SCN 推進、釋放鎖、LGWR 寫入提交標記) / ROLLBACK (應用 Undo 還原) / DDL/DCL 隱式提交 / 會話異常中斷 (PMON 清理回滾)。

顯式事務控制語句

語句作用
COMMIT永久確認當前事務所有修改
ROLLBACK撤銷當前事務所有修改
SAVEPOINT name設置保存點,後續可 ROLLBACK TO name 部分回滾

SAVEPOINT 示例

UPDATE accounts SET bal=bal-100 WHERE id='A';
SAVEPOINT before_B;
UPDATE accounts SET bal=bal+100 WHERE id='B';
-- 發現 B 賬戶狀態異常
ROLLBACK TO before_B;  -- 僅撤銷 B 存入,A 扣款保留
COMMIT;                -- 最終確認 A 扣款

隱式提交/回滾場景

  • 隱式提交:正常退出 SQL*Plus、執行 DDL/DCL、SET AUTOCOMMIT ON (默認 OFF)。
  • 隱式回滾:異常退出 SQL*Plus、實例崩潰、會話被 Kill (PMON 執行)。

AUTOCOMMIT 陷阱

SET AUTOCOMMIT ON;   -- 之後每條 DML 即時提交,無法 ROLLBACK
SET AUTOCOMMIT OFF;  -- 恢復手動控制 (推薦生產環境默認)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved