ORACLE的鎖機制


ORACLE的鎖機制 html

設立封鎖機制主要是爲了對併發操做進行控制,對干擾進行封鎖,保證數據的一致性和準確性。Oracle數據庫封鎖方式有三種:共享封鎖,獨佔封鎖,共享更新封鎖 數據庫

Oracle RDBMS的封鎖類型可分爲以下三類: 數據結構

1、內部級封鎖 
內部級封鎖是用於保護ORACLE內部結構,由系統內部實現,用戶不能訪問,所以咱們沒必要對此作過多的瞭解。 併發

2、DDL級封鎖(字典/語法分析封鎖) 
DDL級封鎖也是由ORACLE RDBMS來控制,它用於保護數據字典和數據定義改變時的一致性和完整性。它是系統在對SQL定義語句做語法分析時自動地加鎖,無需用戶幹予。字典/語法分析封鎖共分三類: 
(1)、字典操做鎖:用於對字典操做時,鎖住數據字典,此封鎖是獨佔的,從而保護任何一個時刻僅能對一個字典操做。 
(2)、字典定義鎖:用於防止在進行字典操做時又進行語法分析,這樣能夠避免在查詢字典的同時改動某個表的結構。 
(3)、表定義鎖:用於 一個SQL語句正當訪問某個表時,防止字典中與該表有關的項目被修改。 性能

3、DML級封鎖 
DML級封鎖用於控制併發事務中的數據操縱,保證數據的一致性和完整性,其封鎖對象能夠是表或行。 
對用戶的數據操縱,Oracle能夠自動爲操縱的數據進行封鎖,但若是有操縱受權,則爲知足併發操縱的須要另外實施封鎖。DML封鎖可由一個用戶進程以顯式的方式加鎖,也可經過某些SQL語句隱含方式實現。
DML鎖有以下三種封鎖方式: 
(1)、共享封鎖方式(SHARE) 
(2)、獨佔封鎖方式(EXCLUSIVE) 
(3)、共享更新封鎖(SHARE UPDATE) htm

其中SHARE,EXCLUSIVE用於表封鎖,SHARE UPDATE用於行封鎖。 
一、共享方式的表封鎖 
共享方式的表封鎖是對錶中的全部數據進行封鎖,該鎖用於保護查詢數據的一致性,防止其它用戶對已封鎖的表進行更更新。其它用戶只能對該表再施加共享方式的鎖,而不能再對該表施加獨佔方式的封鎖,共享更新鎖能夠再施加,但不容許持有共享更新封鎖的進程作更新。共享該表的全部用戶只能查詢表中的數據,但不能更新。共享方式的表封鎖只能由用戶用SQL語句來設置,基語句格式以下: 對象

LOCK TABLE <表名>[,<表名>]... 
IN SHARE MODE [NOWAIT] blog

執行該語句,對一個或多個表施加共享方式的表封鎖。當指定了選擇項NOWAIT,若該封鎖暫時不能施加成功,則返回並由用戶決定是進行等待,仍是先去執行別的語句。 
持有共享鎖的事務,在出現以下之一的條件時,便釋放其共享鎖: 
A、執行COMMIT或ROLLBACK語句。 
B、退出數據庫(LOG OFF)。 
C、程序中止運行。 
共享方式表封鎖經常使用於一致性查詢過程,即在查詢數據期間表中的數據不發生改變。 索引

二、獨佔方式表封鎖 
獨佔方式表封鎖是用於封鎖表中的全部數據,擁有該獨佔方式表封鎖的用戶,便可以查詢該表,又能夠更新該表,其它的用戶不能再對該表施加任何封鎖(包括共享、獨佔或共享更新封鎖)。其它用戶雖然不能更新該表,但能夠查詢該表。 
獨佔方式的表封鎖可經過以下的SQL語句來顯示地得到: 進程

LOCK TABLE <表名>[,<表名>].... 
IN EXCLUSIVE MODE [NOWAIT]

獨佔方式的表封鎖也能夠在用戶執行DML語句INSERT、UPDATE、DELETE時隱含得到。 
擁有獨佔方式表封鎖的事務,在出現以下條件之一時,便釋放該封鎖: 
(1)、執行COMMIT或ROLLBACK語句。 
(2)、退出數據庫(LOG OFF) 
(3)、程序中止運行。 
獨佔方式封鎖一般用於更新數據,當某個更新事務涉及多個表時,可減小發生死鎖。

三、共享更新封鎖方式 
共享更新封鎖是對一個表的一行或多行進行封鎖,於是也稱做行級封鎖。表級封鎖雖然保證了數據的一致性,但卻減弱了操做數據的並行性。行級封鎖確保在用戶取得被更新的行到該行進行更新這段時間內不被其它用戶所修改。於是行級鎖便可保證數據的一致性又能提升數據操做的迸發性。 
可經過以下的兩種方式來得到行級封鎖: 
(1)、執行以下的SQL封鎖語句,以顯示的方式得到:

LOCK TABLE <表名>[,<表名>].... 
IN SHARE UPDATE MODE [NOWAIT]

(2)、用以下的SELECT ...FOR UPDATE語句得到:

SELECT <列名>[,<列名>]... 
FROM <表名> 
WHERE <條件> 
FOR UPDATE OF <列名>[,<列名>].....[NOWAIT]

一旦用戶對某個行施加了行級封鎖,則該用戶能夠查詢也能夠更新被封鎖的數據行,其它用戶只能查詢但不能更新被封鎖的數據行.若是其它用戶想更新該表中的數據行,則也必須對該表施加行級鎖.即便多個用戶對一個表均使用了共享更新,但也不容許兩個事務同時對一個表進行更新,真正對錶進行更新時,是以獨佔方式封鎖表,一直到提交或復原該事務爲止。行鎖永遠是獨佔方式鎖。 
當出現以下之一的條件,便釋放共享更新鎖: 
(1)、執行提交(COMMIT)語句; 
(2)、退出數據庫(LOG OFF) 
(3)、程序中止運行。 
執行ROLLBACK操做不能釋放行鎖。 
從上面講述可見,ORACLE RDBMS的加鎖機制,解決了併發事務的相容與互斥問題。相容保證事務的併發性,互斥確保數據的一致性。不一樣用戶鎖的相容與互斥關係由下圖給出。

其中最後一行最後一列爲其它用戶提供在不一樣行上設置SHARE UPDATE鎖。但當用戶1在某行上進行更新操做時,用戶2只有等待用戶1提交事務後,才能更新本身所封鎖的行。

 

死鎖 封鎖雖然可以有效的解決併發操做,可是任何資源的獨佔都會有死鎖的危險。例如:有兩個事務T1,T2,T1對數據A施加獨佔封鎖,T2對數據B施加了獨佔封鎖。再假設T1要對數據B加鎖,因爲B已被T2獨佔封鎖,所以T1置於等待狀態,等待B被釋放;如今若T2也要對A進行封鎖,因爲A已被T1獨佔封鎖,所以T2也被置於等待狀態。這樣就造成了兩個事務相互等待的狀態,並且永遠不能結束,此種狀況稱爲死鎖。  在Oracle系統中能自動發現死鎖,並選擇代價最小的,即完成工做量最少的事務予以撤消,釋放該事務所擁有的所有鎖,記其它的事務繼續工做下去。   從系統性能上考慮,應該儘量減小資源競爭,增大吞吐量,所以用戶在給併發操做加鎖時,應注意如下幾點:  1、對於UPDATE和DELETE操做,應只封鎖要作改動的行,在完成修改後當即提交。  2、當多個事務正利用共享更新的方式進行更新,則不要使用共享封鎖,而應採用共享更新封鎖,這樣其它用戶就能使用行級鎖,以增長並行性。  3、儘量將對一個表的操做的併發事務施加共享更新鎖,從而可提升並行性。  4、在應用負荷較高的期間,不宜對基礎數據結構(表、索引、簇和視圖)進行修改。

相關文章
相關標籤/搜索