Oracle 鎖機制
阿新 • • 發佈:2017-06-17
brush 語句 tx鎖 表示 解析 delete 目的 模式 oracl
二、接下來依次討論以上三種鎖結構:
1.DML鎖
DML鎖主要包括TM鎖和TX鎖,其中TM鎖稱為意向鎖或表級鎖,TX鎖稱為行級鎖或事務鎖。
1.1 TM鎖
TM鎖包含如下類型:
在Oracle的每行數據上,都有一個標誌位來表示該行數據是否被鎖定。這樣就極大的減小了行級鎖的維護開銷,也不可能出現鎖升級。數據行上的鎖標誌一旦被置位,就 表明該行數據被加X鎖。
Oracle在數據行上沒有S鎖,換句話說就是TX鎖只有一種--行級獨占鎖。(註意TX鎖在v$lock的lmode也是6,但是這個6與TM鎖的6號X鎖是完全不同的兩個東西)
驗證如下:
2.3 可中斷解析鎖 會話解析一條語句時,對於該語句引用的每一個對象都會施加解析鎖,這個目的是如果以某種方式刪除或修改了引用對象,可以將共享池中已經解析的緩存語句無效刷出。
3.內部閂鎖機制(略) 詳見博文,關於Oracle buffer pool/shared pool的內部閂鎖機制的實現。
以前雖然在網上看到很多關於Oracle鎖機制的描述,但總感覺哪裏有缺陷不適合自己,因此花了點時間參考Tom Tyke的《Oracle 9i/10g/11g編程藝術》一書整理了一下Oracle鎖相關的知識。
聲明:本文屬於個人讀後感,內容不保證100%正確。
一、Oracle數據庫的鎖類型:
根據保護的對象不同,Oracle數據庫鎖可以分為以下幾大類: 1、DML鎖(data locks,數據鎖),用於保護數據的完整性; 2、DDL鎖(dictionary locks,字典鎖),用於保護數據庫對象的結構,如表、索引等的結構定義; 3、內部鎖和閂(internal locks and latches),保護數據庫的內部結構。TM鎖的兼容性如下:
1.2 TX鎖
TX的本義是Transaction(事務),當一個事務第一次執行數據更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE語句進行查詢時,它即獲得一個TX(事務)鎖,直至該事務結束(執行COMMIT或ROLLBACK操作)時,該鎖才被釋放。 在同一個事務中,無論是鎖定一行,還是一百萬行,對於Oracle來說TX鎖的開銷是一樣的。這點可能與其他數據庫很不一樣,原因如下: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鎖
2.3 可中斷解析鎖 會話解析一條語句時,對於該語句引用的每一個對象都會施加解析鎖,這個目的是如果以某種方式刪除或修改了引用對象,可以將共享池中已經解析的緩存語句無效刷出。
3.內部閂鎖機制(略) 詳見博文,關於Oracle buffer pool/shared pool的內部閂鎖機制的實現。
Oracle 鎖機制