【Oracle】鎖
阿新 • • 發佈:2018-09-16
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號,其組形式: |
ID2 | 根據TYPE不同而有所不同 對於TM 鎖 ID2 值為0 對於TX 鎖 ID2 以十進制數值表示環繞wrap的次數,即事務槽被重用的次數 |
LMODE |
|
REQUEST | 大於0時,表示當前會話被阻塞,其它會話占有改鎖的模式 |
TIME |
|
BLOCK |
|
若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】鎖