oracle的TM鎖、TX鎖

kunlunzhiying發表於2016-12-30

的鎖型別

         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', /* Not blocking any other processes */
1, 'Blocking', /* This lock blocks other processes */
2, 'Global', /* This lock is global, so we can't tell */

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

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';


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28211342/viewspace-2131680/,如需轉載,請註明出處,否則將追究法律責任。

相關文章