本課內容屬於Oracle高級課程范疇內容略微偏向理論性但是與數據庫程序開發和管理優化密切相關另外本課的部分內容在前面章節已經涉及請注意理論聯系實際
事務
事務(Transaction)從 通訊的角度看是用戶定義的數據庫操作序列這些操作要麼全做要麼全不做是不可分割的一個工作單元事務控制語句稱為TCL一般包括Commit和Rollback
事務不是程序事務和程序分屬兩個概念在RDBMS中一個事務可以有一條SQL語句一組SQL語句或者整個程序一個應用程序又通常包含多個事務
事務是恢復和並發控制的基本單元
顯式事務和隱式事務
begin
insert into classes_(bjbhbjmcbjmsbzrssxbbjrsbz)
values (測試班級測試班級肖豐斌);
commit/rollback;
end ;
insert into classes_(bjbhbjmcbjmsbzrssxbbjrsbz)
values (測試班級測試班級肖豐斌);
commit/rollback;
事務的ACID特性和結束方式
事務的ACID特性和結束方式
破壞事務ACID特性的因素包括
多個事務並行運行時不同事務的操作交叉執行
事務在運行過程中被強行終止
事務的結束方式包括
並行性和一致性
並行性和一致性是針對多用戶多事務而非單用戶單事務數據庫環境的其含義是在多用戶多事務環境下針對同一張數據庫表的數據存在同時更新(含Update和InsertDelete)的情況
並行性意味著多用戶能夠同時訪問數據
一致性意味著每個用戶看到的數據是一致的
為保證數據的一致性一般采用了事務隔離機制(事務隔離模型)又稱為事務串行化用來保證事務盡量按照串行的方式執行
執行並行事務要防止三種情況
髒讀事務讀取了另外一個沒有提交的事務的數據(髒數據)
非重復讀事務重新讀取了以前讀取的數據結果發現另外一個已經提交的事務已經修改了那些數據
幻影讀一個事務重新執行返回滿足條件的行集數據結果發現另外一個已經提交的事務插入了滿足條件的其他行的數據
隔離層未提交的讀模式提交的讀模式重復讀模式串行化模式髒讀可能不可能不可能不可能非重復讀可能可能不可能不可能幻影讀可能可能可能不可能
並行性適用的情況
前提條件是必須是多CPU的服務器上執行此時並行性的好處才能顯示出來單CPU服務器上實驗並行性反而會降低性能
;處理對大表(至少萬行記錄以上)的大數據量查詢
;處理連接非常大的表查詢
;處理建立大索引大容量數據裝載匯總計算
;處理Oracle對象間大量數據拷貝等作業
;處理在SMP(對稱多處理器)或MPP(大規模並行處理)群和聚合(多機器同時訪問同一組磁盤和主數據庫)的機器上的查詢
;處理存放在分布於不同磁盤的多個數據文件中的數據查詢
;處理需要大量輔助內存的查詢如Group byOrder By等
語句級讀一致性和事務級讀一致性
Oracle鎖
什麼是數據庫鎖
鎖是用於防止在訪問相同的資源(包括用戶對象系統對象內存Oralce數據字典中的共享數據結構最常見的是數據庫表Table對象)時 事務之間的有害性 交互(存取)的一種機制
不同類型的鎖代表了當前用戶是允許還是阻止其它用戶對相同資源的同時存取從而確保不破壞系統數據的完整性一致性和並行性
加鎖是實現數據庫並發控制的一個非常重要的技術當事務在對某個數據對象進行操作前先向系統發出請求對其加鎖加鎖後事務就對該數據對象有了一定的控制在該事務釋放鎖之前其他的事務不能對此數據對象進行更新操作
兩種鎖機制
共享鎖(Share Lock)即S鎖是通過對數據存取的高並行性來實現的加了共享鎖的數據庫對象可以被其它事務讀取但是不能被其它事務修改
獨占鎖(Exclusive Lock)即X鎖又稱排它鎖是用來防止同時共享相同資源的鎖加了獨占鎖的數據庫對象不能被其它事務讀取和修改
;鎖在事務保持期間是被保持的用來防止包括髒讀丟失更新和破壞性DLL等交互行為對一個事務中SQL語句所做的修改只有在該事務提交或回滾後才能被其它事務所使用
;Commit或Rollback執行後事務所使用的鎖被釋放
死鎖
鎖的類型
數據鎖(DML鎖)
用來保證並行訪問數據的完整性能夠防止同步沖突的DML和DDL操作的破壞性 交互是Oracle中主要的鎖又包括表級鎖(TM鎖)和行級鎖(TX鎖也稱為事務鎖)
()TM鎖
數據鎖(DML鎖)
()TX鎖及DML鎖工作機制
TX鎖是Transaction eXclusive Lock行級排它鎖對一條記錄加上TX鎖後其他用戶不能修改刪除該記錄
;當Oracle 執行DML語句時系統自動在所要操作的表上申請TM類型的鎖當TM鎖獲得後系統再自動申請TX類型的鎖並將實際鎖定的數據行的鎖標志位進行置位 這樣在事務加鎖前檢查TX鎖相容性時就不用再逐行檢查鎖標志而只需檢查TM鎖模式的相容性即可大大提高了系統的效率TM鎖包括了SSSXSX 等多種模式在數據庫中用-來表示不同的SQL操作產生不同類型的TM鎖
數據鎖(DML鎖)
()TX鎖及DML鎖工作機制
;在數據行上只有X鎖(排他鎖)在 Oracle數據庫中當一個事務首次發起一個DML語句時就獲得一個TX鎖該鎖保持到事務被提交或回滾當兩個或多個會話在表的同一條記錄上執行 DML語句時第一個會話在該條記錄上加鎖其他的會話處於等待狀態當第一個會話提交後TX鎖被釋放其他會話才可以加鎖
;當Oracle數據庫發生TX鎖等待時如果不及時處理常常會引起Oracle數據庫掛起或導致死鎖的發生產生ORA的錯誤這些現象都會對實際應用產生極大的危害如長時間未響應大量事務失敗等
字典鎖(DDL鎖)
當 DDL命令發出時Oracle會自動在被處理的對象上添加DDL鎖定從而防止對象被其他用戶所修改當DDL命令結束以後則釋放DDL鎖定DDL鎖定不能顯式的被請求只有當對象結構被修改或者被引用時才會在對象上添加DDL鎖定比如創建或者編譯 存儲過程時會對引用的對象添加DDL鎖定在創建視圖時也會對引用的表添加DDL鎖定等
在執行DDL命令之前Oracle會自動添加一個隱式提交命令然後執行具體的DDL命令在DDL命令執行結束之後還會自動添加一個隱式提交命令實際上Oracle在執行DDL命令時都會將其轉換為對數據字典表的DML操作比如我們發出創建表的DDL命令時Oracle會
字典鎖(DDL鎖)
將表的名稱插入數據字典表tab$裡同 時將表裡的列名以及列的類型插入col$表裡等因此在DDL命令中需要添加隱式的提交命令從而提交那些對數據字典表的DML操作即使DDL命令失 敗它也會發出提交命令DDL鎖包括三種類型
;排他的DDL鎖定(Exclusive DDL Lock)
大部分的DDL操作都會在被操作的對象上添加排他的DDL鎖定從而防止在DDL命令執行期間對象被其他用戶所修改當對象上添加了排他的DDL鎖定以後該對象上不能再添加任何其他的DDL鎖定如果是對表進行DDL命令則其他進程也不能修改表裡的數據
字典鎖(DDL鎖)
;共享的DDL鎖定(Shared DDL Lock )
用來保護被DDL的對象不被其他用戶進程所更新但是允許其他進程在對象上添加共享的DDL鎖定如果是對表進行DDL命令則其他進程可以同時修改表裡 的數據比如我們發出create view命令創建視圖時在視圖的所引用的表(這種表也叫基表)上添加的就是共享的DDL命令也就是說在創建視圖時其他用戶不能修改 基表的結構但 是可以更新基表裡的數據
內部鎖
內部鎖保護內部數據庫結構如數據文件對用戶是不可見的
字典鎖(DDL鎖)
;可打破的解析鎖定(Breakable Parsed Lock)
在shared pool裡緩存的SQL游標或者PL/SQL程序代碼都會獲得引用對象上的解析鎖定如果我們發出DDL命令修改了某個對象的結構時該對象相關的位於 shared pool裡的解析鎖定就被打破從而導致引用了該對象的SQL游標或者PL/SQL程序代碼全都失效下次再次執行相同的SQL語句時需要重新解析這 也就是所謂的SQL語句的reload了可打破的解析鎖定不會阻止其他的DDL鎖定如果發生與解析鎖定相沖突的DDL鎖定則解析鎖定也會被打破
死鎖的解決
查找鎖
Kill 操作系統進程
Orakill 實例名 操作系統進程ID
Orakill oralearn
其中oralearn是數據庫sid是第二步查出spid
數據完整性
常用的數據完整性約束規則包括
NOT NULL
唯一關鍵字
主關鍵字
外鍵
檢查項Check
由於本部分內容再前面的章節中已經穿插講解本處不再贅述
要點及習題
習題
什麼是事務請解釋什麼是顯式事務和隱式事務
事務具有哪四個特性?並行性 事務主要使用的情況是什麼請舉出四種情況
事務級讀一致性包括那三種類型並列表說明其相同點和不同點
什麼是數據庫鎖包括那兩種大的類型?TM鎖又包括那些類型?
將表級鎖和行級鎖結合起來舉例解釋數據鎖的工作機制
什麼是死鎖?死鎖解決的步驟是什麼?
為什麼數據庫設計不推薦大量使用外鍵來確保數據完整性?
From:http://tw.wingwit.com/Article/program/Oracle/201404/30544.html