怎么驗(yàn)證LOCK請(qǐng)求的FIFO機(jī)制

本篇內(nèi)容主要講解“怎么驗(yàn)證LOCK請(qǐng)求的FIFO機(jī)制”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“怎么驗(yàn)證LOCK請(qǐng)求的FIFO機(jī)制”吧!

創(chuàng)新互聯(lián)建站主營(yíng)察哈爾右翼前網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都App定制開發(fā),察哈爾右翼前h5重慶小程序開發(fā)搭建,察哈爾右翼前網(wǎng)站營(yíng)銷推廣歡迎察哈爾右翼前等地區(qū)企業(yè)咨詢

在多并發(fā)的會(huì)話場(chǎng)景中,需要先獲取資源的X鎖定才能對(duì)該資源進(jìn)行修改。與此同時(shí),當(dāng)其他會(huì)話也同樣請(qǐng)求修改該資源時(shí),則必須按照先進(jìn)先服務(wù)的方式(FIFO)進(jìn)入請(qǐng)求隊(duì)列排隊(duì)等候。以下實(shí)驗(yàn)可以驗(yàn)證這一機(jī)制。

創(chuàng)建表

create table t1(c1 number, c2 number);

insert into t1 values(101, 5000);

commit;

三個(gè)會(huì)話按照先后順序試圖更新數(shù)據(jù),會(huì)話的SID可以通過以下查詢獲取

select userenv('sid') from dual;

Session1(SID:129)

update t1 set c2=6000 where c1=101;

Session2(SID:135)

update t1 set c2=7000 where c1=101;

Session3(SID:138)

update t1 set c2=8000 where c1=101;

可以看到,Session1執(zhí)行更新后因?yàn)闆]有提交,Session2和Session3都在等待。此時(shí)查詢事務(wù)信息,顯示有一個(gè)事務(wù)

select xid, addr, ses_addr, xidusn, xidslot, xidsqn, ubafil, ubablk, ubasqn, ubarec, status, start_time from v$transaction;

XID              ADDR             SES_ADDR             XIDUSN    XIDSLOT     XIDSQN     UBAFIL     UBABLK     UBASQN     UBAREC STATUS           START_TIME

---------------- ---------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------- --------------------

0100060090020000 000007FF49D24CA8 000007FF4C78B2A0          1          6        656          3        717        145         35 ACTIVE           10/04/17 11:44:47

查看鎖定信息,存在事務(wù)回滾段號(hào)XIDUSN的會(huì)話表示正在執(zhí)行的事務(wù),129會(huì)話優(yōu)先獲取鎖,XIDUSN為0則表示會(huì)話被鎖,處于等待狀態(tài),LOCKED_MODE為3表示行獨(dú)占鎖

col oracle_username for a15

select * from v$locked_object;

    XIDUSN    XIDSLOT     XIDSQN  OBJECT_ID SESSION_ID ORACLE_USERNAME OS_USER_NAME                   PROCESS                  LOCKED_MODE

---------- ---------- ---------- ---------- ---------- --------------- ------------------------------ ------------------------ -----------

         1          6        656      73449        129 SYS             VM-ORA11G-1\Administrator      3136:1796                          3

         0          0          0      73449        135 SYS             VM-ORA11G-1\Administrator      2932:2184                          3

         0          0          0      73449        138 SYS             VM-ORA11G-1\Administrator      3820:2100                          3

再看鎖隊(duì)列,129會(huì)話因?yàn)橐呀?jīng)獲取到鎖,所以只有AE會(huì)話鎖,沒有TX鎖請(qǐng)求,CTIME為請(qǐng)求時(shí)間,135會(huì)話先于138會(huì)話,REQUEST大于0表示當(dāng)前會(huì)話被阻塞,其它會(huì)話以對(duì)應(yīng)的模式占有鎖

select * from v$enqueue_lock where sid in (129, 135, 138);

ADDR             KADDR                   SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK

---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------

000007FF4CC56968 000007FF4CC569C0        129 AE        100          0          4          0       6898          0

000007FF4CC56BD8 000007FF4CC56C30        135 AE        100          0          4          0       3183          0

000007FF4CC56E48 000007FF4CC56EA0        135 TX      65542        656          0          6       3152          1

000007FF4CC56F18 000007FF4CC56F70        138 AE        100          0          4          0       3140          0

000007FF4CC57000 000007FF4CC57058        138 TX      65542        656          0          6       3106          0

鎖類型TYPE列的定義:TM-表級(jí)鎖,TX-事務(wù)鎖,MR-Media Recovery(每個(gè)文件一個(gè)),AE-會(huì)話鎖(每個(gè)會(huì)話一個(gè)),UL-用戶定義的鎖類型

鎖模式LMODE列的定義:0-none;1-空(NULL);2-行共享(RS);3-行獨(dú)占(RX);4-共享鎖(S);5-共享行獨(dú)占(SRX);6-獨(dú)占鎖(X)

dump等待隊(duì)列,可見129會(huì)話que為own表示正在持有鎖,135會(huì)話和138會(huì)話que為wat表示正在鎖請(qǐng)求等待

oradebug setmypid

oradebug tracefile_name

oradebug dump enqueues 8

000007FF4CD05DC0 TX-00010006-00000290 U   0   0   0   0   0   1 40 [4cd25530,4cd25530]

         [49d24d30,49d24d30] [4cd05df0,4cd05df0] [4cc56eb0,4cc57068]

   lock     que owner    session        hold wait ser link

   ----------------------------------------------------------------------

   000007FF49D24D20 OWN 000007FF4C78B2A0 000007FF4C78B2A0 (129)    X NLCK  73 [4cd05dd0,4cd05dd0]

   000007FF4CC56EA0 WAT 000007FF4C779C00 000007FF4C779C00 (135) NLCK    X 1468 [4cc57068,4cd05de0]

   000007FF4CC57058 WAT 000007FF4C7710B0 000007FF4C7710B0 (138) NLCK    X 1191 [4cd05de0,4cc56eb0]

對(duì)照驗(yàn)證,將Session1提交,查看事務(wù),新的事務(wù)在執(zhí)行

select xid, addr, ses_addr, xidusn, xidslot, xidsqn, ubafil, ubablk, ubasqn, ubarec, status, start_time from v$transaction;

XID              ADDR             SES_ADDR             XIDUSN    XIDSLOT     XIDSQN     UBAFIL     UBABLK     UBASQN     UBAREC STATUS           START_TIME

---------------- ---------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------- --------------------

050006005D030000 000007FF49D256A8 000007FF4C779C00          5          6        861          3        536        187         14 ACTIVE           10/04/17 11:45:36

查看鎖定對(duì)象,129會(huì)話的鎖已釋放,所以無記錄,135會(huì)話正在執(zhí)行事務(wù)而獲得鎖,138會(huì)話則繼續(xù)等待

col oracle_username for a15

select * from v$locked_object;

    XIDUSN    XIDSLOT     XIDSQN  OBJECT_ID SESSION_ID ORACLE_USERNAME OS_USER_NAME                   PROCESS                  LOCKED_MODE

---------- ---------- ---------- ---------- ---------- --------------- ------------------------------ ------------------------ -----------

         5          6        861      73449        135 SYS             VM-ORA11G-1\Administrator      2932:2184                          3

         0          0          0      73449        138 SYS             VM-ORA11G-1\Administrator      3820:2100                          3

查看請(qǐng)求隊(duì)列,129會(huì)話和135會(huì)話都已經(jīng)獲取了請(qǐng)求,138會(huì)話仍有TX鎖請(qǐng)求

select * from v$enqueue_lock where sid in (129, 135, 138);

ADDR             KADDR                   SID TYPE        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK

---------------- ---------------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------

000007FF4CC56968 000007FF4CC569C0        129 AE          100          0          4          0      21793          0

000007FF4CC56BD8 000007FF4CC56C30        135 AE          100          0          4          0      18078          0

000007FF4CC56E48 000007FF4CC56EA0        138 TX       327686        861          0          6        674          0

000007FF4CC56F18 000007FF4CC56F70        138 AE          100          0          4          0      18035          0

dump等待隊(duì)列,可見135會(huì)話que為own表示正在持有鎖,138會(huì)話que為wat表示正在鎖請(qǐng)求等待

oradebug setmypid

oradebug tracefile_name

oradebug dump enqueues 8

000007FF4CD07F98 TX-00050006-0000035d U   0   0   0   0   0   1 40 [4cd25bc0,4cd25bc0]

         [49d25730,49d25730] [4cd07fc8,4cd07fc8] [4cc56eb0,4cc56eb0]

   lock     que owner    session        hold wait ser link

   ----------------------------------------------------------------------

   000007FF49D25720 OWN 000007FF4C779C00 000007FF4C779C00 (135)    X NLCK 1468 [4cd07fa8,4cd07fa8]

   000007FF4CC56EA0 WAT 000007FF4C7710B0 000007FF4C7710B0 (138) NLCK    X 1191 [4cd07fb8,4cd07fb8]

對(duì)照驗(yàn)證,將Session2提交,查看事務(wù),又一新的事務(wù)在執(zhí)行

select xid, addr, ses_addr, xidusn, xidslot, xidsqn, ubafil, ubablk, ubasqn, ubarec, status, start_time from v$transaction;

XID              ADDR             SES_ADDR             XIDUSN    XIDSLOT     XIDSQN     UBAFIL     UBABLK     UBASQN     UBAREC STATUS           START_TIME

---------------- ---------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------- --------------------

09000D003D030000 000007FF49CC9678 000007FF4C7710B0          9         13        829          3       2477        184         28 ACTIVE           10/04/17 11:46:22

查看鎖定對(duì)象,135會(huì)話的鎖也已釋放,138會(huì)話正在執(zhí)行事務(wù)而獲得鎖,沒有會(huì)話在等待了

col oracle_username for a15

select * from v$locked_object;

    XIDUSN    XIDSLOT     XIDSQN  OBJECT_ID SESSION_ID ORACLE_USERNAME OS_USER_NAME                   PROCESS                  LOCKED_MODE

---------- ---------- ---------- ---------- ---------- --------------- ------------------------------ ------------------------ -----------

         9         13        829      73449        138 SYS             VM-ORA11G-1\Administrator      3820:2100                          3

查看請(qǐng)求隊(duì)列,已經(jīng)沒有TX鎖請(qǐng)求

select * from v$enqueue_lock where sid in (129, 135, 138);

ADDR             KADDR                   SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK

---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------

000007FF4CC56968 000007FF4CC569C0        129 AE        100          0          4          0      24483          0

000007FF4CC56BD8 000007FF4CC56C30        135 AE        100          0          4          0      20768          0

000007FF4CC56F18 000007FF4CC56F70        138 AE        100          0          4          0      20725          0

dump等待隊(duì)列,只有138會(huì)話的記錄了,并且que為own表示已經(jīng)擁有

oradebug setmypid

oradebug tracefile_name

oradebug dump enqueues 8

000007FF4CD00378 TX-0009000d-0000033d U   0   0   0   0   0   1 40 [4cd23730,4cd23730]

         [49cc9700,49cc9700] [4cd003a8,4cd003a8] [4cd00398,4cd00398]

   lock     que owner    session        hold wait ser link

   ----------------------------------------------------------------------

   000007FF49CC96F0 OWN 000007FF4C7710B0 000007FF4C7710B0 (138)    X NLCK 1191 [4cd00388,4cd00388]

如果此時(shí)關(guān)閉已經(jīng)提交了的Session1和Session2會(huì)話,則請(qǐng)求隊(duì)列中不會(huì)再有129和135會(huì)話的AE鎖記錄,在Oracle 11g中AE鎖是每個(gè)會(huì)話都會(huì)有一個(gè)的,對(duì)于Oracle 10g則不存在AE會(huì)話鎖

select * from v$enqueue_lock where sid in (129, 135, 138);

ADDR             KADDR                   SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK

---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------

000007FF4CC56F18 000007FF4CC56F70        138 AE        100          0          4          0      21120          0

由此,我們通過實(shí)驗(yàn)來驗(yàn)證了鎖隊(duì)列的FIFO機(jī)制,遵循先請(qǐng)求先服務(wù)的原則。

最后,清理實(shí)驗(yàn)用表

drop table t1 purge;

到此,相信大家對(duì)“怎么驗(yàn)證LOCK請(qǐng)求的FIFO機(jī)制”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

分享題目:怎么驗(yàn)證LOCK請(qǐng)求的FIFO機(jī)制
瀏覽地址:http://muchs.cn/article4/ijopoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄服務(wù)器托管、Google外貿(mào)網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化