oracle 鎖機制

oracle 有兩種基本鎖,排它鎖(Exclusive Locks,即X鎖)和共享鎖(Share Locks,即S鎖)。當對象被加排他鎖時,其他事務不能對它加任何鎖直到該事務提交或回滾,排它鎖通常用於更新數據;當對象加了共享鎖時,其他事務只能對它加共享鎖,直到該事務提交或回滾,通常用於用於保護查詢數據的一致性,防止其它用戶對已封鎖的表進行更新

根據保護的對象不同,Oracle數據庫鎖可以分爲以下幾大類:
DML鎖(data locks,數據鎖),用於保護數據的完整性;
DDL鎖(dictionary locks,字典鎖),用於保護數據庫對象的結構,如表、索引等的結構定義;
系統鎖 (System Locks ,系統鎖),保護 數據庫的內部結構。

DML鎖又分爲TM(表級鎖)和TX(行級鎖),當oracle執行DML時,系統先自動在所操作表桑加TM鎖,再自動加TX鎖

鎖模式 鎖描述 解釋 對應操作
0 none    
1 NULL   SELECT
2
Row Share (RS) 
行級共享鎖,其他對象只能查詢這些數據行 
LOCK SHARE UPDATE
LOCK ROW SHARE
3
Row Exclusive Table Lock (RX) 
行級排它鎖,在提交前不允許做DML操作
Insert、Update、Delete、 Select for update
4
Share Table Lock (S)
共享鎖,其他事務只能對它進行讀取,添加共享鎖,不能修改。

Create index、Lock share
5
Share Row Exclusive Table Lock (SRX)
共享行級排它鎖

Lock share row exclusive 

6
Exclusive Table Lock (X)
 
排它鎖,其他事務不能加任何鎖。

Alter table、Drop able、Drop index、Truncate table 、Lock exclusive



顯示創建 :
LOCK TABLE <表名>[,<表名>]...  IN  <mode> MODE [NOWAIT]
當指定了選擇項NOWAIT,若該封鎖暫時不能施加成功,則返回並由用戶決定是進行等待,還是先去執行別的語句。
不指定NOWAIT,若不能施加成功,則等待。

死鎖-deadlock
定義:當兩個用戶希望持有對方的資源時就會發生死鎖.
例子:
1:用戶1對A表進行Update,沒有提交。
2:用戶2對B表進行Update,沒有提交。
此時雙反不存在資源共享的問題。
3:如果用戶2此時對A表作update,則會發生阻塞,需要等到用戶一的事物結束。
4:如果此時用戶1又對B表作update,則產生死鎖。此時Oracle會選擇其中一個用戶進行會滾,使另一個用戶繼續執行操作。

查看數據庫中的鎖
SELECT b.MACHINE,b.USERNAME,a.sid,a.type,a.lmode,a.BLOCK FROM V$LOCK a,v$session b where a.sid=b.sid;

殺死進程:
select 'alter system kill session '''||sid||','||serial#||''';' from v$session where sid in (select sid from v$lock where block = 1); 

查看誰鎖了誰
select s1.username || ' ' || s1.machine
  || ' ( SID=' || s1.sid || ' )  is blocking '
  || s2.username || ' '|| s2.machine || ' ( SID=' || s2.sid || ' ) ' AS blocking_status
  from v$lock l1, v$session s1, v$lock l2, v$session s2
  where s1.sid=l1.sid and s2.sid=l2.sid
  and l1.BLOCK= 1 and l2.request > 0
  and l1.id1 = l2.id1
  and l2.id2 = l2.id2 ;

相關視圖
視圖名 描述 說明
V$LOCK V$LOCK lists the locks currently held by the Oracle Database and outstanding requests for a lock or latch.  
V$LOCKED_OBJECT V$LOCKED_OBJECT lists all locks acquired by every transaction on the system. It shows which sessions are holding DML locks (that is, TM-type enqueues) on what objects and in what mode. 與V$LOCK的區別在於只列出TM鎖
V$LOCK_TYPE V$LOCK_TYPE describes the type of locks available.  
v$session
V$SESSION displays session information for each current session.
 
v$sqltext
displays the text of SQL statements belonging to shared SQL cursors in the SGA.
 

下面列出V$LOCK的字段說明

列名 類型 字段說明
ADDR RAW(4 | 8) Address of lock state object
KADDR RAW(4|8) Address of lock
SID NUMBER 會話的sid,可以和v$session 關聯
TYPE VARCHAR2(2) 區分該鎖保護對象的類型(表4)
TM – DML enqueue
TX – Transaction enqueue
UL – User supplied
–我們主要關注TX和TM兩種類型的鎖
–UL鎖用戶自己定義的,一般很少會定義,基本不用關注
–其它均爲系統鎖,會很快自動釋放,不用關注
ID1
ID2
NUMBER ID1,ID2的取值含義根據type的取值而有所不同
對於TM 鎖
ID1表示被鎖定表的object_id 可以和dba_objects視圖關聯取得具體表信息,ID2 值爲0
對於TX 鎖
ID1以十進制數值表示該事務所佔用的回滾段號和事務槽slot number號,其組形式:
0xRRRRSSSS,RRRR=RBS/UNDO NUMBER,SSSS=SLOT NUMBER
ID2 以十進制數值表示環繞wrap的次數,即事務槽被重用的次數
LMODE NUMBER
  • 0 – none
  • 1 – null (NULL)
  • 2 – Row Share (RS) 
  • 3 – Row Exclusive Table Lock (RX) 
  • 4 – Share Table Lock (S)
  • 5 – Share Row Exclusive Table Lock (SRX)
  • 6 – Exclusive Table Lock (X)
REQUEST NUMBER 大於0時,表示當前會話被阻塞,其它會話佔有改鎖的模式
CTIME NUMBER
  • 已持有或者等待鎖的時間
BLOCK NUMBER
  • 0 - The lock is not blocking any other processes
  • 1 - The lock is blocking other processes
  • 2 - The lock is not blocking any blocked processes on the local node, but it may or may not be blocking processes on remote nodes. This value is used only in Oracle Real Application Clusters (Oracle RAC) configurations (not in single instance configurations).
  0:不堵塞 1:堵塞 2:只適用於rac 
發佈了26 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章