用戶會話只是用戶到數據庫的一個連接,而用戶對數據庫的操作則是通過會話中的一個個事務來進行的。對事務的管理不僅僅是DBA的任務,每個發布事務的用戶也能夠對自已的事務進行管理。
事務的開始:
Oracle中的事務由遇到的第一條可執行SQL語句開始。
DDL (Data Definition Language)
DML(Data Manipulation Language )
事務的結束:
·用戶執行commit或rollback語句
·用戶執行一條DDL語句,比如create,drop,rename,alter。如果當前事務中包含有已經執行的DML語句,Oracle首先提交事務,然後再將DDL語句作為一個新的只包含一條語句的事務執行並提交。
·用戶主動斷開到Oracle的連接。
·用戶進程意外中止。
提交事務前完成的工作:
·在SGA區的回退緩存中生成該事務的回退條目。在回退條目中保存有該事務所修改的數據的原始版本。
·在SGA區的重做日志緩存中生成該事務的重做記錄。重做記錄中記載了該事務對數據塊所進行的修改,並且還記載了對回退段中的數據塊所進行的修改。緩存中的重做記錄有可能在事務提交之前就寫入硬盤中。
·在SGA區的數據庫緩豐中記錄了事務對數據庫所進行的修改。這些修改也有可能在事務提交之前就寫入硬盤中。
提交事務時完成的工作:
·在為該事務指定的回退段中的內部事務表內記錄下這個事務已經被提交,並且生成一個惟一的SCN記錄在內部事務表中,用於惟一標識這個事務。
·LGWR後進進程將SGA區重做日志緩存中的重做記錄寫入聯機重做日志文件。在寫入重做日志的同時還將寫入該事務的SCN。
·Oracle服務進程釋放事務所使用的所有記錄鎖與表鎖。
·Oracle通知用戶事務提交完成。
·Oracle將該事務標記為已完成。
回退事務完成的工作:
·Oracle通過使用回退段中的回退條目,撤銷事務中所有SQL語句對數據庫所做的修改。
·Oracle服務進程釋放事務所使用的所有鎖
·Oracle通知事務回退成功。
·Oracle將該事務標記為已完成
事務的隔離等級:
(servers=dedicated)
set transaction isolation level read committed
set transaction isolation level serializable
set transaction read only
set transaction read write
alter session set isolation_level=serializable
alter session set isolation_level=read commited
讀一致性的工作機制:
設定查詢語句的SCN:10023
該查詢語句在搜索所需要的數據塊時,
如果所需數據塊的SCN<=10023,則讀取。
如果所需數據塊的SCN>10023,查詢語句將從回退段中獲取對應的數據塊的原始版本(原始版本的SCN同樣要<=10023)
這樣,通過對數據塊的SCN進行比較,查詢語句將只返回在它開始執行之前已經提交的數據,保證了不會讀取到未提交事務所修改的髒數據塊,也不會讀取到語句開始執行後再提交的數據塊。
定義私有回退段
set transaction use rollback segment XXX