Oracle數據完整性和鎖機制

Oracle數據完整性和鎖機制

本課內容屬於Oracle高級課程範疇,內容略微偏向理論性,可是與數據庫程序開發和管理、優化密切相關;另外本課的部份內容在前面章節已經涉及,請注意理論聯繫實際。 html

事務  數據庫

    事務(Transaction) 通信的角度看:是用戶定義的數據庫操做序列,這些操做要麼全作、要麼全不作,是不可分割的一個工做單元。事務控制語句稱爲TCL,通常包括CommitRollback 緩存

    事務不是程序,事務和程序分屬兩個概念。在RDBMS中,一個事務能夠有一條SQL語句、一組SQL語句或者整個程序;一個應用程序又一般包含多個事務。 服務器

    事務是恢復和併發控制的基本單元。 數據結構

顯式事務和隱式事務 併發

begin 數據庫設計

    insert into classes_2(bjbh,bjmc,bjms,bzr,ssxb,bjrs,bz) 性能

    values ('888','測試班級','測試班級','肖豐斌','003','38',''); 測試

    commit/rollback; 大數據

   end ;

   insert into classes_2(bjbh,bjmc,bjms,bzr,ssxb,bjrs,bz)

    values ('888','測試班級','測試班級','肖豐斌','003','38','');

    commit/rollback;

 

事務的ACID特性和結束方式

clip_image001

事務的ACID特性和結束方式

破壞事務ACID特性的因素包括:

   1.多個事務並行運行時,不一樣事務的操做交叉執行

   2.事務在運行過程當中被強行終止

事務的結束方式包括:

clip_image002 

 

並行性和一致性

 

   並行性和一致性是針對多用戶、多事務,而非單用戶、單事務數據庫環境的,其含義是在多用戶、多事務環境下,針對同一張數據庫表的數據存在同時更新(含UpdateInsertDelete)的狀況。

  並行性意味着多用戶可以同時訪問數據;

  一致性意味着每一個用戶看到的數據是一致的。

   爲保證數據的一致性,通常採用了事務隔離機制(事務隔離模型),又稱爲事務串行化,用來保證事務儘可能按照串行的方式執行。

 

執行並行事務要防止三種狀況:

1.髒讀:事務讀取了另一個沒有提交的事務的數據(髒數據)

2.非重複讀:事務從新讀取了之前讀取的數據,結果發現另一個已經提交的事務已經修改了那些數據;

3. 幻影讀:一個事務從新執行,返回知足條件的行集數據,結果發現另一個已經提交的事務插入了知足條件的其餘行的數據。

 

隔離層

未提交的讀模式

提交的讀模式

重複讀模式

串行化模式

髒讀

可能

不可能

不可能

不可能

非重複讀

可能

可能

不可能

不可能

幻影讀

可能

可能

可能

不可能

 

並行性適用的狀況

前提條件是必須是多CPU的服務器上執行,此時並行性的好處才能顯示出來,單CPU服務器上實驗並行性反而會下降性能。 

 

處理對大表(至少100萬行記錄以上)的大數據量查詢

處理鏈接很是大的表查詢

處理創建大索引、大容量數據裝載、彙總計算

處理Oracle對象間大量數據拷貝等做業

處理在SMP(對稱多處理器)MPP(大規模並行處理)羣和聚合(多機器同時訪問同一組磁盤和主數據庫)的機器上的查詢

處理存放在分佈於不一樣磁盤的多個數據文件中的數據查詢

處理須要大量輔助內存的查詢,如Group byOrder By

 

語句級讀一致性和事務級讀一致性

clip_image003

clip_image004 

 

clip_image005 

 

clip_image006 

 

Oracle

 

什麼是數據庫鎖

    鎖是用於防止在訪問相同的資源(包括用戶對象、系統對象、內存、Oralce數據字典中的共享數據結構,最多見的是數據庫表Table對象) ,事務之間的有害性 交互(存、取)的一種機制。

    不一樣類型的鎖,表明了當前用戶是容許仍是阻止其它用戶對相同資源的同時存取,從而確保不破壞系統數據的完整性、一致性和並行性。

    加鎖是實現數據庫併發控制的一個很是重要的技術。當事務在對某個數據對象進行操做前,先向系統發出請求,對其加鎖。加鎖後事務就對該數據對象有了必定的控制,在該事務釋放鎖以前,其餘的事務不能對此數據對象進行更新操做。

兩種鎖機制

共享鎖(Share Lock):S鎖,是經過對數據存取的高並行性來實現的。加了共享鎖的數據庫對象能夠被其它事務讀取,可是不能被其它事務修改。

獨佔鎖(Exclusive Lock):X鎖,又稱排它鎖,是用來防止同時共享相同資源的鎖。加了獨佔鎖的數據庫對象不能被其它事務讀取和修改。

 

鎖在事務保持期間是被保持的,用來防止包括髒讀、丟失更新和破壞性DLL等交互行爲。對一個事務中SQL語句所作的修改只有在該事務提交或回滾後才能被其它事務所使用。

•CommitRollback執行後,事務所使用的鎖被釋放。

死鎖

clip_image007

 

鎖的類型

1.數據鎖(DML)

用來保證並行訪問數據的完整性。可以防止同步衝突的DMLDDL操做的破壞性 交互。是Oracle中主要的鎖,又包括表級鎖(TM鎖)和行級鎖(TX鎖、也稱爲事務鎖)。

(1).TM

  clip_image008

 

1.數據鎖(DML) 

(2).TX鎖及DML鎖工做機制

  TX鎖是Transaction eXclusive Lock行級排它鎖,對一條記錄加上TX鎖後,其餘用戶不能修改、刪除該記錄。

Oracle 執行DML語句時,系統自動在所要操做的表上申請TM類型的鎖。當TM鎖得到後,系統再自動申請TX類型的鎖,並將實際鎖定的數據行的鎖標誌位進行置位。 這樣在事務加鎖前檢查TX鎖相容性時就不用再逐行檢查鎖標誌,而只需檢查TM鎖模式的相容性便可,大大提升了系統的效率。TM鎖包括了SSSXSX 等多種模式,在數據庫中用06來表示。不一樣的SQL操做產生不一樣類型的TM鎖。

1.數據鎖(DML)

(2).TX鎖及DML鎖工做機制

在數據行上只有X鎖(排他鎖)。在 Oracle數據庫中,當一個事務首次發起一個DML語句時就得到一個TX鎖,該鎖保持到事務被提交或回滾。當兩個或多個會話在表的同一條記錄上執行 DML語句時,第一個會話在該條記錄上加鎖,其餘的會話處於等待狀態。當第一個會話提交後,TX鎖被釋放,其餘會話才能夠加鎖。

Oracle數據庫發生TX鎖等待時,若是不及時處理經常會引發Oracle數據庫掛起,或致使死鎖的發生,產生ORA-60的錯誤。這些現象都會對實際應用產生極大的危害,如長時間未響應、大量事務失敗等。

 

2.字典鎖(DDL)

   DDL命令發出時,Oracle會自動在被處理的對象上添加DDL鎖定,從而防止對象被其餘用戶所修改。當DDL命令結束之後,則釋放DDL鎖定。DDL鎖定不能顯式的被請求,只有當對象結構被修改或者被引用時,纔會在對象上添加DDL鎖定。好比建立或者編譯 存儲過程時會對引用的對象添加DDL鎖定。在建立視圖時,也會對引用的表添加DDL鎖定等。

在執行DDL命令以前,Oracle會自動添加一個隱式提交命令,而後執行具體的DDL命令,在DDL命令執行結束以後,還會自動添加一個隱式提交命令。實際上,Oracle在執行DDL命令時,都會將其轉換爲對數據字典表的DML操做。好比咱們發出建立表的DDL命令時,Oracle將表的名稱插入數據字典表tab$裏,同 時將表裏的列名以及列的類型插入col$表裏等。所以,在DDL命令中須要添加隱式的提交命令,從而提交那些對數據字典表的DML操做。即便DDL命令失 敗,它也會發出提交命令。DDL鎖包括三種類型:

 

排他的DDL鎖定(Exclusive DDL Lock)  
大部分的DDL操做都會在被操做的對象上添加排他的DDL鎖定,從而防止在DDL命令執行期間,對象被其餘用戶所修改。當對象上添加了排他的DDL鎖定之後,該對象上不能再添加任何其餘的DDL鎖定。若是是對錶進行DDL命令,則其餘進程也不能修改表裏的數據。

2.字典鎖(DDL)

共享的DDL鎖定(Shared DDL Lock )  
用來保護被DDL的對象不被其餘用戶進程所更新,可是容許其餘進程在對象上添加共享的DDL鎖定。若是是對錶進行DDL命令,則其餘進程能夠同時修改表裏 的數據。好比咱們發出create view命令建立視圖時,在視圖的所引用的表(這種表也叫基表)上添加的就是共享的DDL命令。也就是說,在建立視圖時,其餘用戶不能修改 基表的結構,但 是能夠更新基表裏的數據。

3.內部鎖

  內部鎖保護內部數據庫結構,如數據文件,對用戶是不可見的。

 

2.字典鎖(DDL)

 

可打破的解析鎖定(Breakable Parsed Lock)

   shared pool裏緩存的SQL遊標或者PL/SQL程序代碼都會得到引用對象上的解析鎖定。若是咱們發出DDL命令修改了某個對象的結構時,該對象相關的、位於 shared pool裏的解析鎖定就被打破,從而致使引用了該對象的SQL遊標或者PL/SQL程序代碼全都失效。下次再次執行相同的SQL語句時,須要從新解析,這 也就是所謂的SQL語句的reload了。可打破的解析鎖定不會阻止其餘的DDL鎖定,若是發生與解析鎖定相沖突的DDL鎖定,則解析鎖定也會被打破

死鎖的解決

1.查找鎖

clip_image009 

 

clip_image010 

 

3.Kill 操做系統進程

Orakill 實例名 操做系統進程ID

Orakill oralearn 2444

其中oralearn是數據庫sid,244是第二步查出spid

  clip_image011

 

數據完整性

經常使用的數據完整性約束規則包括:

1.NOT NULL

2.惟一關鍵字

3.主關鍵字

4.外鍵

5.檢查項Check

 

因爲本部份內容再前面的章節中已經穿插講解,本處再也不贅述

 

 

要點及習題

習題

1.什麼是事務,請解釋什麼是顯式事務和隱式事務。

2.事務具備哪四個特性?並行性 事務主要使用的狀況是什麼,請舉出四種狀況。

3.事務級讀一致性包括那三種類型,並列表說明其相同點和不一樣點。

4.什麼是數據庫鎖,包括那兩種大的類型?TM鎖又包括那些類型?

5.將表級鎖和行級鎖結合起來,舉例解釋數據鎖的工做機制。

6.什麼是死鎖?死鎖解決的步驟是什麼?

7.爲何數據庫設計不推薦大量使用外鍵來確保數據完整性?

相關文章
相關標籤/搜索