Oracle鎖

1、定義:

鎖(lock)機制用於管理對共享資源的併發訪問(使對這些共享資源的併發性訪問串行化),同時還能提供數據完整性和一致性。

2、Oracle鎖特徵:

Oracle中鎖不是稀有資源;

Oracle不會自動升級鎖,永遠不會;

 Oracle 中,行級鎖沒有相關的開銷

3、Oracle鎖分類

DML

DDL

內部鎖或LATCH

4、鎖一覽圖

鎖代碼

鎖模式名稱

鎖模式簡寫

鎖模式級別

備註說明

隱式產生鎖

顯式產生鎖

0

None

None


無鎖模式,select操作便是這樣的情況



1

Null

Null

表級鎖

Oracle在內存中自動加的鎖,主要起通知作用



2

Row-S

SS

表級鎖


10g版本前:FOR UPDATE

LOCK TABLE 表名 IN ROW SHARE MODE;

3

Row-SX

SX

表級鎖

行級排它鎖,主要由DML語句引起

10g版本後:FOR UPDATEDML語句

LOCK TABLE 表名 IN ROW EXCLUSIVE MODE;

4

Share

S

表級鎖

共享鎖、只讀鎖


LOCK TABLE 表名 IN  SHARE MODE;

5

S/Row-X

SSX

表級鎖

共享行排它鎖


LOCK TABLE 表名 IN SHARE ROW EXCLUSIVE MODE;

6

Exclusive

X

表級鎖/行級鎖

排它鎖



RRow  SShare XExclusive


5、TM鎖兼容性


N

SS

SX

S

SSX

X

N

YES

YES

YES

YES

YES

YES

SS

YES

YES

YES

YES

YES

NO

SX

YES

YES

YES

NO

NO

NO

S

YES

YES

NO

YES

NO

NO

SSX

YES

YES

NO

NO

NO

NO

X

YES

NO

NO

NO

NO

NO


6、鎖常用sql

--測試子表:成績表

SELECT * FROM score;

--測試父表:學生信息表

SELECT * FROM student;

--查詢當前會話值

SELECT * FROM v$mystat WHEREROWNUM='1';

--動態性能視圖 v$locked_object 各字段的含義

SELECT l.XIDUSN         AS回滾段號,

      l.XIDSLOT         AS回滾槽號,

      l.XIDSQN          AS回滾序列號,

      l.OBJECT_ID       AS被鎖對象ID,

      l.SESSION_ID      AS持有鎖對象會話ID,

      l.ORACLE_USERNAME AS持有鎖的oracle用戶名,

      l.OS_USER_NAME    AS持有鎖操作系統用戶名,

      l.PROCESS         AS操作系統進程號,

      l.LOCKED_MODE     AS鎖模式

  FROM v$locked_object l;

--當前用戶創建的所有對象,列出部分常用字段含義

SELECT uo.object_name AS對象名稱,

      uo.object_id   AS對象ID,

       uo.object_typeAS對象類型

  FROM user_objects uo;

--通過v$locked_object與user_objects兩表關聯可以得出被鎖的是哪個表以及是被哪個用戶鎖的

SELECT uo.object_name   AS對象名稱,

      uo.object_type    AS對象類型,

      l.ORACLE_USERNAME AS持有鎖的oracle用戶名,

      l.LOCKED_MODE     AS鎖模式

  FROM v$locked_object l,user_objects uo

 WHERE l.OBJECT_ID =uo.object_id;

/* AND l.SESSION_ID=&session_id;*/

--查詢所有正在等待獲得鎖的會話ID及鎖類型

SELECT w.waiting_session AS等待鎖的會話ID,

      w.holding_session AS持有鎖的會話ID,

      w.lock_type       AS鎖類型,

      w.mode_held       AS鎖機制

  FROM dba_waiters w;

--動態性能視圖事務執行列表(未提交狀態),BLOCK=1是堵塞者,BLOCK=0是被堵塞者

SELECT * FROM v$transaction_enqueue;

--查詢阻擋關係

SELECT (SELECT s.USERNAME FROM v$session s WHERE s.SID = a.SID) AS阻擋者名,

       a.SID AS阻擋者會話ID,

       '正在阻擋'AS行爲,

       (SELECT s.USERNAME FROM v$session s WHERE s.SID = b.SID) AS被阻擋者名,

       b.SID AS被阻擋者會話ID

  FROM v$lock a, v$lock b

 WHERE a.ID1 = b.ID1

   AND a.ID2 = b.ID2

   AND a.BLOCK = 1

   AND b.REQUEST > 0;

--根據會話ID查詢前一步sql操作語句,這個語句不適合應用程序

SELECT sq.sql_text

  FROM v$sql sq

 WHERE sq.SQL_ID =

       (SELECT s.SQL_ID FROM v$session s WHERE s.SID =&session_id);


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