1. 程式人生 > >【Oracle】鎖

【Oracle】鎖

span 全部 stat varchar 存取 是否 aci 數值 alt

Oracle所有鎖的分配和管理都是數據庫管理系統自動完成的,不需要用戶進行幹預。

v$lock表說明

字段

描述

ADDR Address of lock state object
KADDR Address of lock
SID 會話的sid,可以和v$session 關聯
TYPE 所獲得的或等待的鎖類型,取值如下:
①Tx --事務
②TM --表鎖或DML
③MR --介質恢復
④ST --磁盤空間事務
ID1 根據TYPE不同而有所不同
對於TM 鎖
ID1表示被鎖定表的object_id 可以和dba_objects視圖關聯取得具體表信息
對於TX 鎖

ID1以十進制數值表示該事務所占用的回滾段號和事務槽slot number號,其組形式:
0xRRRRSSSS,RRRR=RBS/UNDO NUMBER,SSSS=SLOT NUMBER

ID2 根據TYPE不同而有所不同
對於TM 鎖
ID2 值為0
對於TX 鎖
ID2 以十進制數值表示環繞wrap的次數,即事務槽被重用的次數
LMODE
  • 0:無
  • 1:空
  • 2:行共享(XS)
  • 3:行獨占(RX)
  • 4:共享(S)
  • 5:共享行獨占(SRX)
  • 6:獨占(X)
REQUEST 大於0時,表示當前會話被阻塞,其它會話占有改鎖的模式
TIME
  • 已持有或者等待鎖的時間
BLOCK
  • 是否阻塞其他會話鎖申請 1:阻塞 0:不阻塞

若LMODE含有一個不是0或1的數值,則表明進程已經獲得一個鎖。若REQUEST列含有一個不是0或者1的數值,則表明進程正在等待一個鎖,若LMODE列含有的數值全部是0,則表明進程正在等待一個鎖。

監控鎖

查看所信息

SELECT B.SID,C.USERNAME,C.TERMINAL,B.ID2,B.TYPE,B.LMODE,B.REQUEST
FROM 
DBA_OBJECTS A,V$LOCK B,V$SESSION C
WHERE A.OBJECT_ID(+)=B.ID1
AND B.SID=C.SID
AND C.USERNAME IS NOT NULL
ORDER BY B.SID,B.ID2

以下是在SQL*Plus中運行結果

技術分享圖片

set echo off:顯示start啟動的腳本中的每個sql命令,缺省為on

set pagesize 60:輸出每頁行數,缺省為24,為了避免分頁,可設定為0。

column SID format 999 heading "SessionID":格式化SID列數字顯示並且列名為SessionID

column USERNAME format A8:字段長度格式化為8 (Trunc為截取的意思)

format的格式元素

元素符號 說明 例子
An 為varchar類型的列的列內容設置寬度,如果內容超過指定的寬度,則內容自動換行 A10
9 設置number列的現實格式 999999
$ 浮動的貨幣符號 $99
L 本地的貨幣符號 L99
. 小數點位置 9999.9
, 千位分隔符 9,999

鎖的分類

描述 加鎖的方法
行共享鎖RS 對數據表定義行共享鎖後,如果事務A獲得,那麽A事務可以進行並發查詢、插入、刪除及加鎖,但不能以排他的方式存取該數據表 lock table xx in row share mode
行排他鎖RX 對數據表定義了行排他鎖後,如果被事務A獲得,那麽A事務對數據表中的行數據有排他權限,其他事物可以對統一數據表進行增刪改查及加鎖,但是不能使用以下3種方式加鎖:
①行共享鎖
②共享行排他鎖
③行排他鎖
lock table xx in row exclusive mode
共享鎖S 對數據表定義共享鎖後,如果事務被A獲得,其他事務可以執行並發查詢和加共享鎖但不能修改表,也不能使用以下3種方式加鎖:
①排他鎖
②共享行排他鎖
③行排他鎖
lock table xx in share mode
共享行拍他鎖SRX 對數據表定義共享行拍他鎖後,如果事務被A獲得,其他事務可以執行並發查詢和對其他數據行加鎖,但不能修改表,也不能使用以下4種方式加鎖:
①排他鎖
②共享行排他鎖
③行排他鎖
④共享鎖
lock table xx in share row exclusive mode
排他鎖 排他鎖是最嚴格的鎖。如果事務被A獲得,A可以執行對數據庫的讀寫操作,其他事務可以執行查詢,但是不能插入和修改、刪除操作 lock table xx in exclusive mode

鎖表案例

打開2個SQL*Plus窗口,此處我把這兩個窗口的名稱叫做P1,P2,分別連接到同一個用戶;

在數據庫中有表TMP005,結構與數據如下:

TY
A
B
C

1.先在P1窗口刪除值為A的記錄

技術分享圖片

2.先在P2窗口刪除值為B的記錄

技術分享圖片

3.然後回到P1刪除值為B的記錄

技術分享圖片

4.接著回到P2刪除值為A的記錄

技術分享圖片

從上面2圖我們可以初步發現,死鎖已經形成了,接下來就是解鎖

解鎖操作:https://www.cnblogs.com/OliverQin/p/9593239.html

【Oracle】鎖