文章出處

以前雖然在網上看到很多關于Oracle鎖機制的描述,但總感覺哪里有缺陷不適合自己,因此花了點時間參考Tom Tyke的《Oracle 9i/10g/11g編程藝術》一書整理了一下Oracle鎖相關的知識。

一、Oracle數據庫的鎖類型:

根據保護的對象不同,Oracle數據庫鎖可以分為以下幾大類:    
1、DML鎖(data locks,數據鎖),用于保護數據的完整性;    
2、DDL鎖(dictionary locks,字典鎖),用于保護數據庫對象的結構,如表、索引等的結構定義;    
3、內部鎖和閂(internal locks and latches),保護數據庫的內部結構。 
二、接下來依次討論以上三種鎖結構:
 
1.DML鎖
DML鎖主要包括TM鎖和TX鎖,其中TM鎖稱為意向鎖或表級鎖,TX鎖稱為行級鎖或事務鎖。
1.1 TM鎖(也叫意向鎖/表級鎖)
TM鎖包含如下類型:

TM鎖的兼容性如下:(Y表示兼容,N表示沖突)

1.2 TX鎖

TX的本義是Transaction(事務),當一個事務第一次執行數據更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE語句進行查詢時,它即獲得一個TX(事務)鎖,直至該事務結束(執行COMMIT或ROLLBACK操作)時,該鎖才被釋放。
在同一個事務中,無論是鎖定一行,還是一百萬行,對于Oracle來說TX鎖的開銷是一樣的。因此Oracle從來都不會鎖升級,因為事務鎖只含表級鎖和行級鎖。這點可能與其他數據庫不一樣,原因如下:
在Oracle的每行數據上,都有一個標志位來表示該行數據是否被鎖定。這樣就極大的減小了行級鎖的維護開銷,也不可能出現鎖升級。數據行上的鎖標志一旦被置位,就表明該行數據被加X鎖。
Oracle在數據行上沒有S鎖,換句話說就是TX鎖只有一種--行級獨占鎖(注意TX鎖在v$lock的lmode也是6,但是這個6與TM鎖的6號X鎖是完全不同的兩個東西)
 

1.3 舉例說明

當發出一個DML命令后會話獲取一個3號的TM鎖,和一個針對特定行的6號TX鎖。
行級只有X鎖,且鎖模式為6,再次重申這里的6并不是指TM的6號表鎖。此外Oracle一個事務中只會獲取一個TX鎖,但有多少個表對象就會獲取多少個TM表級鎖。
驗證如下:

查詢鎖的語句為:

select sid,type,id1,lmode,request,block from v$lock l where sid in (select session_id from v$locked_object) and type in ('TM', 'TX') order by 1;

1.4 DML鎖的總結:

讀永遠不會阻止寫。但有唯一的一個例外,就是select ...for update。
寫永遠不會阻塞讀。
當一行被修改后,Oracle通過回滾段提供給數據的一致性讀。
注意:以上說明的讀和寫不會互相阻塞是指在事務鎖(TM)級別不會,但讀寫之間依然會發生數據庫內部閂鎖的爭用。具體詳見數據庫內部閂鎖的博文。

 
2.DDL鎖

重點:DDL是保護表結構定義的。
DDL命令發出時,Oracle會自動在被處理的對象上添加DDL鎖定,從而防止對象被其他用戶所修改。當DDL命令結束以后,則釋放DDL鎖定。DDL鎖定不能顯式的被請求,只有當對象結構被修改或者被引用時,才會在對象上添加DDL鎖定。
并不是所有DDL都會觸發DDL鎖,例如現在的創建索引語句,就只會獲取一個S模式的TM鎖,因此不會阻塞讀。而online模式創建索引的語句則只會獲取一個RS模式的TM鎖,因此連DML也不會被阻塞。但是事務應盡快提交,原因參見博文:http://blog.itpub.net/7417681/viewspace-1061318/
需要注意的是DDL總會提交,即便是執行不成功也是如此,因此如果在事務中執行了DDL語句會導致所有事物被提交。驗證很容易,在一個窗口執行一條delete然后執行DDL,你會發現記錄被不可逆轉的刪除了,RollBack無效。因此針對事務中的DDL請務必使用自治事務實現。
DDL鎖有3種:(第一種在表對象上的體現就是X模式的TM鎖)
2.1 排他DDL鎖
一般對表的DDL語句都會獲取一個X模式的TM鎖,這是為什么在表結構更改時只能查詢不能修改的原因。
2.2 共享DDL鎖
共享DDL鎖的常見情形為創建存儲過程時,會嘗試為所有涉及到的表添加共享DDL鎖,這會允許類似的DDL操作并發,但會阻止所有想要獲取排他DDL鎖的會話(即更改表結構的會話)。
2.3 可中斷解析鎖
會話解析一條語句時,對于該語句引用的每一個對象都會施加解析鎖,這個目的是如果以某種方式刪除或修改了引用對象,可以將共享池中已經解析的無效緩存語句刷出。
 
3.內部閂鎖機制(略)
詳見博文,關于Oracle buffer pool/shared pool的內部閂鎖機制的實現。

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()