ORACLE事務管理概述
在 Oracle 中一個事務(transaction)開始於首個可執行的 SQL 語句
(executable SQL statement)。可執行的 SQL 語句指產生了對例項(instance)
的呼叫(call)的 SQL 語句,包括 DML 和 DDL 語句。
當一個事務(transaction)開始時,Oracle 為此事務分配一個可用的撤銷表空
間(undo tablespace)來記錄其產生的回滾條目(rollback entry)。
一個事務(transaction)在滿足以下條件之一時結束:
● 使用者提交了 COMMIT 語句,或不包含 SAVEPOINT 子句的
ROLLBACK 語句。
● 使用者執行了 CREATE,DROP,RENAME,或 ALTER 等 DDL 語句。如
果當前事務中包含 DML 語句,那麼 Oracle 首先提交(commit)此事
務,然後將 DLL 語句作為一個只包含一條 SQL 語句的新事務執行並提
交。
● 使用者斷開了與 Oracle 的連線。當前事務將被提交。
● 使用者程式異常結束。則當前事務被回滾(roll back)。
當一個事務(transaction)結束後,下一個可執行的 SQL 語句(executable
SQL statement)將會自動地開始一個新事務。
提示:
應用程式在退出時應該顯示地進行提交(commit)或回滾(roll
back)操作。
事務提交
提交(commit)一個事務(transaction)意味著將此事務中 SQL 語句對資料的修改永久地記錄到資料庫中。
在一個修改了資料的事務(transaction)被提交之前,Oracle進行了以下操
作:
● Oracle生成了撤銷資訊(undo information)。撤銷資訊包含了事務中
各個 SQL 語句所修改的資料的原始值。
● Oracle在 SGA 的重做日誌緩衝區(redo log buffer)中生成了重做日誌
條目(redo log entry)。重做日誌記錄(redo log record)中包含了對數
據塊(data block)和回滾塊(rollback block)所進行的修改操作。這些
記錄可能在事務提交之前被寫入磁碟。
● 對資料的修改已經被寫入 SGA 中的資料庫緩衝區(database buffer)。
這些修改可能在事務提交之前被寫入磁碟。
提示:
已提交事務(committed transaction)中對資料的修改被儲存在
SGA 的資料庫緩衝區(database buffer)中,她們不一定立即被
後臺程式 DBWn 寫入資料檔案(datafile)內。Oracle將選擇適當
的時機進行寫操作以保證系統的效率。因此寫操作既可能發生
在事務提交之前,也可能在提交之後。
事務回滾
回滾(rolling back)的含義是撤銷一個未提交事務(uncommitted transaction)
中已執行的 SQL 語句對資料的修改。Oracle使用撤銷表空間(undo
tablespace)(或回滾段(rollback segment))來儲存被修改的資料的原始
值。而重做日誌(redo log)內則儲存了對資料修改操作的記錄。
使用者可以回滾(roll back)整個未提交事務(uncommitted transaction)。除此
之外,使用者還可以部分回滾未提交事務,即從事務的最末端回滾到事務中任
意一個被稱為儲存點(savepoint)的標記處。
以下各種型別回滾操作(rollback)的過程基本相同:
● 語句級回滾(tatement-level rollback)(由於語句執行錯誤或死鎖
(deadlock)造成)
● 回滾到一個儲存點(savepoint)
● 依據使用者請求回滾一個事務(transaction)
● 由於程式異常終止而回滾一個事務
● 由於例項(instance)異常終止而回滾所有正在執行的事務
● 在資料庫恢復(recovery)過程中回滾不完整的事務
不考慮儲存點(savepoint)而回滾(rolling back)整個事務(transaction)的過程如下:
1. Oracle使用相關撤銷表空間(undo tablespace)內的資訊來撤銷事務內
所有 SQL 語句對資料的修改
2. Oracle釋放事務中使用的所有鎖
3. 事務結束
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8183550/viewspace-667671/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 分散式事務概述分散式
- Oracle資料庫事務隔離級別概述Oracle資料庫
- MySQL事務提交流程概述MySql
- oracle 事務Oracle
- oracle事務Oracle
- Spring的事務管理(二)宣告式事務管理Spring
- jdbctemplate事務管理JDBC
- Spring 事務管理Spring
- jdbctemplate與事務管理JDBC
- Spring事務管理Spring
- oracle,db2,mysql類比之八事務管理OracleDB2MySql
- Spring的事務管理入門:程式設計式事務管理(TransactionTemplate)Spring程式設計
- oracle 中的事務Oracle
- Oracle只讀事務Oracle
- oracle分散式事務Oracle分散式
- Spring原始碼剖析8:Spring事務概述Spring原始碼
- Spring系列.事務管理Spring
- Spring系列-事務管理Spring
- Spring的事務管理Spring
- Part I CDB中服務的概述04-Oracle多租戶管理員指南Oracle
- 分散式事務概述及大廠通用解決方案分散式
- Mycat分散式事務兩階段提交過程概述分散式
- 全面分析 Spring 的程式設計式事務管理及宣告式事務管理Spring程式設計
- oracle的只讀事務Oracle
- Oracle事務控制總結Oracle
- oracle事務內部原理Oracle
- Oracle的事務和鎖Oracle
- Oracle 查詢事務數Oracle
- oracle必須注意事務Oracle
- Spring事務管理總結Spring
- SpringBoot新增事務管理Spring Boot
- golang的巢狀事務管理Golang巢狀
- Spring 中的事務管理Spring
- spring 事務管理機制Spring
- Spring事務管理全解析Spring
- Oracle 巢狀事務 VS 自治事務Oracle巢狀
- 【開發篇sql】 基礎概述(一) 鎖定和事務SQL
- spring事務管理原始碼分析(二)事務處理流程分析Spring原始碼