成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Oracle Enqueue(隊列)

IT那活兒 / 2801人閱讀
Oracle Enqueue(隊列)

點擊上方“IT那活兒”公眾號,關(guān)注后了解更多內(nèi)容,不管IT什么活兒,干就完了!?。?/strong> 


  

Enqueue(隊列)是一種共享內(nèi)存結(jié)構(gòu),用于串行訪問數(shù)據(jù)庫資源,關(guān)聯(lián)一個會話或事務(wù),它是Oracle訪問數(shù)據(jù)庫對象的lock,每個試圖鎖住資源的會話,將會獲得這個資源的Enqueue。


01

Enqueue通常用"TYPE-ID1-ID2"格式表示,其中:
"TYPE" 用兩個字符串表示,如:TX、TM、UL、BL、BR、CF等。

02

Enqueue包含用戶類型的鎖和系統(tǒng)鎖。
2.1 用戶類型的鎖
用戶鎖是用戶應(yīng)用程序獲得的鎖,來保護數(shù)據(jù)的完整性和用戶對象的結(jié)構(gòu)。
用戶類型的鎖等待不是Oracle代碼的問題,是應(yīng)用程序代碼的問題。
用戶類型的鎖有三種類型:TX、TM、UL。
  • TM鎖稱為表級鎖;
  • TX鎖稱為事務(wù)鎖或行級鎖;
  • UL是用戶使用DBMS_LOCK包自定義的鎖。
2.2 系統(tǒng)鎖
系統(tǒng)鎖包含:
  • CF(Controlfile Enqueue)

  • DX (Distributed Transaction Enqueue)

  • FB (Block Format Enqueue)

  • HW( High Water Enqueue)

  • JS (Job Scheduler Enqueue)

  • RO (Fast Object Reuse Enqueue)

  • SQ( Sequence Cache Enqueue)

  • ST( Space Transaction Enqueue)

  • TO( Temporary Table Object Enqueue)

  • TT (Tablespace Operations Enqueue)

  • US( Undo Segment Enqueue)等等

系統(tǒng)鎖通常會自動釋放,不用過多關(guān)注。
生產(chǎn)環(huán)境中TX類型的鎖比較常見。
  • LOCK: TX "Transaction Enqueue".

TX鎖是表中單個行的行鎖,當(dāng)某行被增刪改、合并及SELECT ... FOR UPDATE時,事務(wù)就獲得了該行的行鎖,直到提交或回滾才釋放該鎖。
當(dāng)TX鎖競爭出現(xiàn),通常會出現(xiàn)各種enq: TX - 等待事件,如:
  • enq: TX - contention

  • enq: TX - row lock contention

  • enq: TX - allocate ITL entry

  • enq: TX - index contention

以enq: TX - row lock contention舉例
test1表如下:
--會話1:
update u1.test1 set name=MM where id=5
--會話2:
update u1.test1 set name=zz where id=5
--DBA會話3:
SELECT sid,type,id1,id2,lmode,request FROM v$lock WHERE type=TX;
查詢結(jié)果:
SID TYPE ID1 ID2 LMODE REQUEST
52   TX 524288   13106   6    0
59   TX 524288   13106   0    6
表明SID 59正在等待SID 52 持有的TX鎖,它想以獨占模式獲得該鎖。

03

一些常見的處理鎖的實用SQL
3.1 查找blocker、waiter


SELECT DECODE(request,0,Holder: ,Waiter: )||sid sess,
id1, id2, lmode, request, type
FROM V$LOCK
WHERE (id1, id2, type) IN
(SELECT id1, id2, type F
ROM V$LOCK WHERE request>0)
ORDER BY id1, request
查詢結(jié)果:
SESS        ID1 ID2 LMODE REQUEST TYPE
Holder: 52  524288  13106 6    0      TX
Waiter: 59  
524288  13106 0    6      TX
  • SID:52是blocker,正持有該鎖;

  • SID:59是waiter,等待獲得該鎖.


3.2 查詢被鎖的對象、sql_id及sql語句等

SELECT DECODE(LV, 1, Holder:  || S.SID, Waiter:  || S.SID) SESS_STATUS,S.USERNAME,OBJECT_NAME,S.inst_id,S.SID,s.serial#, DECODE(L.LMODE, 0, None, 1, Null, 2, Row-S (SS), 3, Row-X (SX), 4, Share, 5, S/Row-X (SSX), 6, Exclusive, TO_CHAR(L.LMODE)) LOCK_MODE, TRUNC(L.CTIME / 3600) || : || TRUNC(MOD(L.CTIME, 3600) / 60) || : || MOD(L.CTIME, 60) CTIME, S.STATUS, S.MACHINE, S.SQL_ID, Q.SQL_TEXT
FROM (SELECT /*+ NO_MERGE */(3-LEVEL) LV, INST_ID, SID, TYPE, LMODE, CTIME
FROM (SELECT /*+ NO_MERGE */A.INST_ID, A.SID, A.TYPE, A.LMODE, A.REQUEST,
CASE
WHEN REQUEST = 0 THEN ID1
END ID1,
CASE
WHEN REQUEST > 0 THEN ID1
END ID3,
A.CTIME
FROM GV$LOCK A
WHERE A.TYPE <> MR) START WITH REQUEST > 0 CONNECT BY PRIOR ID3 = ID1 ) L,
GV$SESSION S,
GV$PROCESS P,
dba_objects O,
GV$SQL Q
WHERE L.SID = S.SID
AND L.INST_ID = S.INST_ID
AND S.INST_ID = P.INST_ID(+)
AND S.PADDR = P.ADDR(+)
AND S.ROW_WAIT_OBJ# = O.OBJECT_ID(+)
AND S.SQL_ID = Q.SQL_ID(+)
GROUP BY DECODE(LV, 1, Holder:  || S.SID, Waiter:  || S.SID), S.INST_ID,S.SID,s.serial#, S.USERNAME, O.OBJECT_NAME, L.TYPE, L.LMODE, L.CTIME, S.STATUS, S.MACHINE,S.SQL_ID,Q.SQL_TEXT;
查詢結(jié)果:
SESS_STATUS USERNAME OBJECT_NAME INST_ID SID SERIAL# LOCK_MODE CTIME STATUS MACHINE SQL_ID SQL_TEXT
Holder: 52 U1 1 52 54450 Exclusive 0:34:15 INACTIVE WORKGROUPDREAM
Waiter: 59 U1 TEST1 1 59 50489 None 0:34:6 ACTIVE WORKGROUPDREAM 2btf137sycbdh update u1.test1 set name=zz where id=5


3.3 鎖的處理
查詢數(shù)據(jù)庫鎖情況:
select decode(request,0,Holder,Waiter) req ,s.inst_id , s.sid, s.serial#,p.spid,s.status, id1, id2, lmode, request, l.type, ctime, s.sql_id, s.event#,s.event,s.last_call_et
from gv$lock l

join gv$session s on l.sid=s.sid and l.inst_id=s.inst_id
join gv$process p on s.paddr=p.addr and p.inst_id=s.inst_id
where (id1, id2, l.type) in
(select id1, id2, type from gv$lock where request>0   )
order by id1, ctime desc, request;
操作系統(tǒng)查殺:kill -9 spid.
或數(shù)據(jù)庫殺會話:alter system  kill session sid,serial#.

END



本文作者:談龍鳳

本文來源:IT那活兒(上海新炬王翦團隊)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/129495.html

相關(guān)文章

  • JavaScript數(shù)據(jù)結(jié)構(gòu)03 - 隊列

    摘要:但是,還有一種隊列叫優(yōu)先隊列,元素的添加和移除是依賴優(yōu)先級的。分類優(yōu)先隊列分為兩類最小優(yōu)先隊列最大優(yōu)先隊列最小優(yōu)先隊列是把優(yōu)先級的值最小的元素被放置到隊列的最前面代表最高的優(yōu)先級。那么最小優(yōu)先隊列排序應(yīng)該為,,,。 一、定義 前面我們學(xué)習(xí)了棧的實現(xiàn),隊列和棧非常類似,但是使用了不同的原則,而非后進先出。 隊列是遵循FIFO(First In First Out,先進先出)原則的一組有序...

    Jonathan Shieber 評論0 收藏0
  • JS數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí):隊列

    隊列的定義 隊列是遵循先進先出原則的一組有序的項,與棧的不同的是,棧不管是入棧還是出棧操作都是在棧頂操作,隊列則是在隊尾添加元素,隊頂移除,用一個圖來表示大概是這樣事的:showImg(https://segmentfault.com/img/remote/1460000018133039?w=584&h=294);用一個更形象的例子就是:排隊服務(wù),總是先排隊的人會先接受服務(wù),當(dāng)然不考慮插隊的情況...

    OpenDigg 評論0 收藏0
  • Python數(shù)據(jù)結(jié)構(gòu)——隊列

    摘要:隊列是一種先進先出,的數(shù)據(jù)結(jié)構(gòu)。隊列的另外一項重要操作是讀取隊頭的元素。通常的操作定義一個空隊列,無參數(shù),返回值是空隊列。刪除隊列頭部的數(shù)據(jù)項,不需要參數(shù),返回值是被刪除的數(shù)據(jù),隊列本身有變化。 隊列是一種列表,不同的是隊列只能在隊尾插入元素,在隊首刪除元素。隊列用于存儲按順序排列的數(shù)據(jù),先進先出,這點和棧不一樣,在棧中,最后入棧的元素反而被優(yōu)先處理。可以將隊列想象成在銀行前排隊的人群...

    wwolf 評論0 收藏0
  • JS 隊列-優(yōu)先隊列、循環(huán)隊列

    摘要:隊列是遵行先進先出原則的一組有序的項。優(yōu)先隊列是默認(rèn)隊列的變種,它的元素的添加和移除是基于優(yōu)先級的。如此循環(huán),直至隊列的長度等于,返回勝者行。同時,還掌握了很著名的優(yōu)先隊列循環(huán)隊列這兩種結(jié)構(gòu)。 《學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法》讀書筆記。 隊列是遵行FIFO(First In First Out, 先進先出)原則的一組有序的項。隊列再尾部添加新元素,并從頂部移除元素。 在現(xiàn)實中...

    ctriptech 評論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)-隊列

    摘要:隊列是一種列表不同的是隊列只能在隊尾插入元素在隊首刪除元素是一種先進先出的數(shù)據(jù)結(jié)構(gòu)隊列被用在很多地方比如提交操作系統(tǒng)執(zhí)行的一系列進程打印任務(wù)池等一些仿真系統(tǒng)用隊列來模擬銀行或雜貨店排隊的顧客隊列的操作主要有兩種操作向隊尾中插入新元素入隊刪除 隊列是一種列表, 不同的是隊列只能在隊尾插入元素, 在隊首刪除元素. 是一種 先進先出 的數(shù)據(jù)結(jié)構(gòu). 隊列被用在很多地方, 比如提交操作系統(tǒng)執(zhí)行的...

    miya 評論0 收藏0

發(fā)表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<