Oracle 鎖機制及解鎖

2021-08-15 03:26:13 字數 4480 閱讀 3721

根據要保護的物件不同,oracle的資料鎖可以分成以下幾類:dml鎖,(data locks)資料鎖,用於保護資料的完整性;ddl鎖(dictionary locks),用於保護資料庫內部結構,如表,索引等結構定義;內部鎖和閂(internal locks and latcheds),保護資料庫內部結構。

我們通常遇到的都是dml鎖,dml鎖在通常狀態下都是用於保證併發情況下的資料完整性。在oracle中,主要包含有tm鎖和tx鎖,其中tm鎖稱為表級鎖,tx鎖稱行級鎖或事物鎖。當oracle執行dml語句時,會自動在表上獲取tm鎖,tm鎖獲取之後,再自動獲取tx鎖,並將實際鎖定的資料行的鎖標誌位進行置位,這樣事務監察相容性時就不必逐行檢查了,大大提高了效率。

那鎖等待是如何出現的呢?

在資料行上只有x鎖(排他鎖),在oracle資料庫中,當事物發起乙個dml語句時就獲取了乙個tx鎖,並保持到執行完畢或回滾。當多個會話在表的同一記錄執行dml時,第一條會將記錄加鎖,其他會話等待。如發生了死鎖,將會在oracle日誌(alertsid.log)中看到ora-60錯誤。

悲觀鎖與樂觀鎖的區別在於悲觀鎖認為資料更新時一定會發生衝突,因此需要對記錄加鎖,以保證資料的一致性。oracle在資料更新時通常時候的是悲觀鎖,因其為行級鎖,具有較好的效能,通常針對併發使用。

樂觀鎖與其不同,它認為資料不存在衝突,因此,需要在提交時保證資料一致性,如果不一致,則返回錯誤,由程式本身的邏輯進行處理。

樂觀鎖的實現主要有三種方式:

a. 通過比較提交前後的資料是否發生變化來判斷是否存在資料衝突

b. 通過在表中增加版本戳列,來標示是否發生了變化

c. 通過比對表的時間戳來判斷是否出現了版本變化

可以通過trigger儲存過程實現該樂觀鎖。

v$lock

sid 會話的sid,可以和v$session 關聯

type 區分該鎖保護物件的型別,如tm,tx,rt,mr等

id1 鎖表示1,詳細見下說明

id2 鎖表示2,詳細見下說明

lmode 鎖模式,見下面說明

request 申請的鎖模式,同lmode

ctime 已持有或者等待鎖的時間

block 是否阻塞其他會話鎖申請 1:阻塞 0:不阻塞

lmode取值0,1,2,3,4,5,6, 數字越大鎖級別越高, 影響的操作越多。

1級鎖:select,有時會在v$locked_object出現。

2級鎖即rs鎖,相應的sql有:select for update ,lock *** in row share mode,select for update當對話使用for update子串開啟乙個游標時,所有返回集中的資料行都將處於行級(row-x)獨佔式鎖定,其他物件只能查詢這些資料行,不能進行update、deleteselect for update操作。

3級鎖即rx鎖,相應的sql有:insert, update, delete, lock *** in row exclusive mode,沒有commit之前插入同樣的一條記錄會沒有反應, 因為後乙個3的鎖會一直等待上乙個3的鎖, 我們必須釋放掉上乙個才能繼續工作。

4級鎖即s鎖,相應的sql有:create index, lock *** in share mode

5級鎖即srx鎖,相應的sql有:lock *** in share row exclusive mode,當有主外來鍵約束時update/delete ... ;可能會產生4,5的鎖。

6級鎖即x鎖,相應的sql有:alter table, drop table, drop index, truncate table,lock *** in exclusive mode

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的次數,即事務槽被重用的次數

v$locked_object 

xidusn undo segment number , 可以和v$transaction關聯

xidslot undo slot number

xidsqn 序列號

object_id 被鎖定物件的object_id , 可以和dba_objects關聯

session_id 持有該鎖的session_id, 可以和v$session關聯

oracle_username 持有該鎖的oracle帳號

os_user_name 持有該鎖的作業系統帳號

process 作業系統的程序號,可以和v$process關聯

locked_mode 鎖模式,含義同v$lock.lmode

dba_locks 和v$lock 內容差不多,略

v$session 如果某個session被因為某些行被其他會話鎖定而阻塞,則該檢視中的下面四個字段列出了這些行所屬物件的相關資訊

row_wait_file# 等待的行所在的檔案號

row_wait_obj# 等待的行所屬的object_id

row_wait_block# 等待的行所屬的block

row_wait_row# 等待的行在blcok中的位置

--檢視被鎖的表

select p.spid, a.serial#, c.object_name, b.session_id, b.oracle_username,b.os_user_name

from

v$process p, v$session a, v$locked_object b, all_objects c

where

p.addr = a.paddr

and a.process = b.process

and c.object_id = b.object_id;

--檢視鎖表的程序

select

b.sid,b.serial#

from

v$locked_object a,v$session b

where

a.session_id = b.sid

group

by b.sid,b.serial#;

--單個刪除鎖表的程序

alter system kill session

'36,32435'

--批量刪除鎖表的程序

declare

cursor

mycur

isselect

b.sid,b.serial#

from

v$locked_object a,v$session b

where

a.session_id = b.sid

group

by b.sid,b.serial#;

begin

for cur in mycur

loop

execute

immediate ( 'alter system kill session '''||cur.sid || ','|| cur.serial# ||''' ');

end loop;

end;

oracle檢視表鎖及解鎖

kill session語句 1altersystem kill session 2171,60490 以下幾個為相關表12 3456 7select fromv lock select fromv sqlarea select fromv session select fromv process ...

Oracle 鎖表 解鎖

select l.session id sid,s.serial l.locked mode,l.oracle username,l.os user name,s.machine,s.terminal,o.object name,s.logon time from v locked object l...

Oracle 鎖表 解鎖

以下幾個為相關表 select from v lock select from v sqlarea select from v session select from v process select from v locked object select from all objects sele...