您好,登錄后才能下訂單哦!
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 UPDATE、DML語句 | 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 | 表級鎖/行級鎖 | 排它鎖 | ||
R:Row S:Share X:Exclusive |
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);
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。