1. 程式人生 > >Oracle 鎖機制

Oracle 鎖機制

brush 語句 tx鎖 表示 解析 delete 目的 模式 oracl

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

聲明:本文屬於個人讀後感,內容不保證100%正確。

一、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鎖的兼容性如下:

技術分享

1.2 TX鎖

TX的本義是Transaction(事務),當一個事務第一次執行數據更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE語句進行查詢時,它即獲得一個TX(事務)鎖,直至該事務結束(執行COMMIT或ROLLBACK操作)時,該鎖才被釋放。 在同一個事務中,無論是鎖定一行,還是一百萬行,對於Oracle來說TX鎖的開銷是一樣的。這點可能與其他數據庫很不一樣,原因如下:
在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通過回滾段提供給數據的一致性讀。 註意:以上說明的讀和寫不會互相阻塞是指在DML鎖級別不會,但讀寫之間依然會發生數據庫內部閂鎖的爭用。具體詳見數據庫內部閂鎖的博文。


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的內部閂鎖機制的實現。

Oracle 鎖機制