oracle的TM鎖、TX鎖

Oracle數據庫的鎖類型

         oracle官方文檔裏面關於鎖的定義:Locks are mechanisms that prevent destructive interaction between transactions accessing the same resource—either user objects such as tables and rows or system objects not visible to users, such as shared data structures in memory and data dictionary rows.

         這段話的大概意思是說鎖的作用用來保護tables、rows、shared data structures in memory and data dictionary rows等在交互訪問的時候不會被破壞。

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

DML鎖的目的在於保證併發情況下的數據完整性,在Oracle數據庫中,DML鎖主要包括TM鎖TX鎖,其中TM鎖稱爲級鎖,TX鎖稱爲事務鎖或行級鎖。

       當Oracle執行DML語句時,系統自動在所要操作的表上申請TM類型的鎖。當TM鎖獲得後,系統再自動申請TX類型的鎖,並將實際鎖定的數據行的鎖標誌位進行置位。這樣在事務加鎖前檢查TX鎖相容性時就不用再逐行檢查鎖標誌,而只需檢查TM鎖模式的相容性即可,大大提高了系統的效率。TM鎖包括了SS、SX、S、X 等多種模式,在數據庫中用0-6來表示。不同的SQL操作產生不同類型的TM鎖。

        在數據行上只有X鎖(排他鎖)。在 Oracle數據庫中,當一個事務首次發起一個DML語句時就獲得一個TX鎖,該鎖保持到事務被提交或回滾。當兩個或多個會話在表的同一條記錄上執行 DML語句時,第一個會話在該條記錄上加鎖,其他的會話處於等待狀態。當第一個會話提交後,TX鎖被釋放,其他會話纔可以加鎖。

當Oracle數據庫發生TX鎖等待時,如果不及時處理常常會引起Oracle數據庫掛起,或導致死鎖的發生,產生ORA-60的錯誤。這些現象都會對實際應用產生極大的危害,如長時間未響應,大量事務失敗等。

DML鎖分類表

 

表1 Oracle的TM鎖類型

鎖模式

  鎖描述

  解釋

 SQL操作

0

  none

   

1

  NULL

  空

  Select

2

  SS(Row-S)

  行級共享鎖,其他對象只能查詢這些數據行

  Select for update、Lock for update、Lock row share

3

  SX(Row-X)

  行級排它鎖,在提交前不允許做DML操作

  Insert、Update、Delete、Lock row share

4

  S(Share)

  共享鎖

  Create index、Lock share

5

  SSX(S/Row-X)

  共享行級排它鎖

  Lock share row exclusive

6

  X(Exclusive)

  排它鎖

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

 

 

1.關於V$lock表和相關視圖的說明


 Column

Datatype

  Description

  ADDR

RAW(4 | 8)

  Address of lock state object

  KADDR

RAW(4 | 8)

  Address of lock

  SID

NUMBER

  Identifier for session holding or acquiring the lock

  TYPE

VARCHAR2(2)

  Type of user or system lock

  The locks on the user types are obtained by user applications. Any process that is    blocking others is likely to be holding one of these locks. The user type locks are:

  TM - DML enqueue   

  TX - Transaction enqueue

  UL - User supplied

  --我們主要關注TXTM兩種類型的鎖

  --UL鎖用戶自己定義的,一般很少會定義,基本不用關注

  --其它均爲系統鎖,會很快自動釋放,不用關注

  ID1

NUMBER

  Lock identifier #1 (depends on type)

  ID2

NUMBER

  Lock identifier #2 (depends on type)

  ---當lock type 爲TM時,id1爲DML-locked object的object_id

  ---當lock type 爲TX時,id1爲usn+slot,而id2爲seq。

  --當lock type爲其它時,不用關注

  LMODE

NUMBER

  Lock mode in which the session holds the lock:

  0 - none

  1 - null (NULL)

  2 - row-S (SS)

  3 - row-X (SX)

  4 - share (S)

  5 - S/Row-X (SSX)

  6 - exclusive (X)

  --大於0時表示當前會話以某種模式佔有該鎖,等於0時表示當前會話正在等待該鎖資    源,即表示該會話被阻塞。

  --往往在發生TX鎖時,伴隨着TM鎖,比如一個sid=9會話擁有一個TM鎖,一般會擁有一個 或幾個TX鎖,但他們的id1和id2是不同的,請注意

 REQUEST

NUMBER

Lock mode in which the process requests the lock:

  0 - none

  1 - null (NULL)

  2 - row-S (SS)

  3 - row-X (SX)

  4 - share (S)

  5 - S/Row-X (SSX)

  6 - exclusive (X)

 

--大於0時,表示當前會話被阻塞,其它會話佔有改鎖的模式

CTIME

NUMBER

Time since current mode was granted

BLOCK

NUMBER

The lock is blocking another lock

0, 'Not Blocking',
1, 'Blocking',
2, 'Global',

--該鎖是否阻塞了另外一個鎖

 

2.其它相關視圖說明

 

視圖名

描述

主要字段說明

v$session

查詢會話的信息和鎖的信息。

sid,serial#:表示會話信息。

program:表示會話的應用程序信息。

row_wait_obj#:表示等待的對象,和dba_objects中的object_id相對應。

lockwait :該會話等待的鎖的地址,與v$lock的kaddr對應.

v$session_wait

查詢等待的會話信息。

sid:表示持有鎖的會話信息。

Seconds_in_wait:表示等待持續的時間信息

Event:表示會話等待的事件,鎖等於enqueue

     

dba_locks

對v$lock的格式化視圖。

Session_id:和v$lock中的Sid對應。

Lock_type:和v$lock中的type對應。

Lock_ID1: 和v$lock中的ID1對應。

Mode_held,mode_requested:和v$lock中

的lmode,request相對應。

v$locked_object

只包含DML的鎖信息,包括回滾段和會話信息。

Xidusn,xidslot,xidsqn:表示回滾段信息。和

v$transaction相關聯。

Object_id:表示被鎖對象標識。

Session_id:表示持有鎖的會話信息。

Locked_mode:表示會話等待的鎖模式的信

息,和v$lock中的lmode一致。


 

1.查詢數據庫中的鎖

select * from v$lock;
select * from v$lock where block=1;

2.查詢被鎖的對象

select * from v$locked_object;

3.查詢阻塞

查被阻塞的會話
select * from v$lock where lmode=0 and type in ('TM','TX');

查阻塞別的會話鎖
select * from v$lock where lmode>0 and type in ('TM','TX');

4.查詢數據庫正在等待鎖的進程

select * from v$session where lockwait is not null;

5.查詢會話之間鎖等待的關係


select a.sid holdsid,b.sid waitsid,a.type,a.id1,a.id2,a.ctime from v$lock a,v$lock b

where a.id1=b.id1 and a.id2=b.id2 and a.block=1 and b.block=0;


6.查詢鎖等待事件

select * from v$session_wait where event='enqueue';

7.查找鎖住的表和解鎖

select b.owner TABLEOWNER, b.object_name TABLENAME, c.OSUSER LOCKBY, c.USERNAME LOGINID, c.sid SID, c.SERIAL# SERIAL
from v$locked_object a,dba_objects b, v$session c 
where b.object_id = a.object_id AND a.SESSION_ID =c.sid;
--通過SID, SERIAL解鎖 
--
alter system kill session 'SID, SERIAL';

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章