本篇內(nèi)容主要講解“Oracle的鎖機(jī)制原理”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Oracle的鎖機(jī)制原理”吧! 本篇內(nèi)容主要講解“Oracle的鎖機(jī)制原理”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Oracle的鎖機(jī)制原理”吧!
10多年的雞西網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整雞西建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“雞西網(wǎng)站設(shè)計(jì)”,“雞西網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
一.ORACLE中有關(guān)鎖的動(dòng)態(tài)性能視圖主要有:
V$LOCK
This view lists the locks currently held by the Oracle Database and outstanding requests for a lock or latch.
TM鎖的ID1字段表示對(duì)象的ID號(hào),可以通過DBA_OBJECTS.OBJECT_ID來查到具體的對(duì)象。
TX鎖的ID1代表的是事務(wù)的回滾段回滾段號(hào)、事務(wù)槽號(hào),ID2代表的是順序號(hào)。(V$TRANSACTION.XIDSQN表示事務(wù)槽號(hào))
有關(guān)VLOCK.ID1和ID2的含義可參考文章:http://space.itpub.net/?uid-23135684-action-viewspace-itemid-715468
BLOCK字段如果等于1的話,表示此鎖阻塞了其他DML語句的執(zhí)行,正常應(yīng)該為0。
BLOCK字段的含義:
0, 'Not Blocking', /* Not blocking any other processes */
1, 'Blocking', /* This lock blocks other processes */
2, 'Global', /* This lock is global, so we can't tell */
$ORACLE_HOME/rdbms/admin/catblock.sql特別注意:
0表示沒有阻塞,而不是表示沒有鎖。
如果要查詢是否有會(huì)話阻塞了其他會(huì)話:
SELECT * FROM V$LOCK WHERE BLOCK=1;
通過查詢V$SESSION.BLOCKING_SESSION_STATUS,v$SESSION.BLOCKING_SESSION兩個(gè)字段也可以查看到阻塞其他的會(huì)話。
如果LMODE為0,REQUEST大于1,表示在獲取鎖的時(shí)候失敗,發(fā)生了相應(yīng)鎖的阻塞。例如,在執(zhí)行DML語句時(shí),如果TYPE=TM,LMODE=0,REQUEST=3,就表示此DML語句在獲取表的TM鎖的行排它鎖時(shí)被阻塞,處于等待狀態(tài)。
查找阻塞事務(wù)的事務(wù)會(huì)話信息:
select * from v$lock where (id1,id2)=(select id1,id2 from v$lock where sid= 被鎖的會(huì)話的SID)
V$LOCKED_OBJECT
This view lists all locks acquired by every transaction on the system.
V$LOCK_TYPE
二.其中我們主要查看的是:
LOCK TYPE(按對(duì)象劃分)
V$LOCK_TYPE保存了所有的LOCK TYPE的相關(guān)信息。
主要的有:
TM - DML enqueue
TX - Transaction enqueue
UL - User supplied
MR -Media Recovery
MR鎖用于保護(hù)數(shù)據(jù)文件,使得文件在數(shù)據(jù)庫打開、表空間Online時(shí)不能執(zhí)行恢復(fù)。當(dāng)進(jìn)程對(duì)數(shù)據(jù)文件進(jìn)行恢復(fù)時(shí),需要排他的獲得MR鎖。當(dāng)數(shù)據(jù)庫打開時(shí),每個(gè)文件上都分配一個(gè)MR鎖。ID1代表文件號(hào),也包含了201臨時(shí)文件。
從Oracle 11g開始,每個(gè)登錄的會(huì)話都會(huì)有一個(gè)默認(rèn)的AE鎖。
LOCK MODE(按類型劃分)
0 - none
1 - null (NULL)
2 - row-S (SS) //行共享
3 - row-X (SX) //行排它
4 - share (S) //共享
5 - S/Row-X (SSX) //共享行排它
6 - exclusive (X) //排它從以上LOCK MODE也能看出按類型分鎖只有2種,共享(S),排它(X),把他們不同的組合就成了不同的LOCK MODE了。
如果添加的是X鎖,那么其他任何鎖也不能再添加到此行或表上了。TM就是DML鎖,是表級(jí)上的鎖。TX是事務(wù)鎖,是行級(jí)鎖。在執(zhí)行DML操作時(shí),先對(duì)表加TM鎖,如果加鎖成功,然后再加TX鎖。一般情況下,一個(gè)會(huì)話中,只會(huì)出現(xiàn)一個(gè)TX鎖,可能有多個(gè)TM鎖,這些TM所共享一個(gè)TX鎖。
不同的語句加TM鎖的類型不同,類型就是下面說的LOCK MODE。在表級(jí)上加了TM鎖也是為了防止其他會(huì)話再在表上加上排它鎖(例如對(duì)表執(zhí)行DDL語句)。一個(gè)表上可以加上多個(gè)TM鎖、TX鎖的。例如,A會(huì)話更新了TEST表上ID號(hào)為1的一條記錄,首先會(huì)先在這個(gè)表上加上一個(gè)TM鎖,加鎖成功,會(huì)在ID為1的行上加上一個(gè)TX鎖。如果有另外一個(gè)會(huì)話來同樣來更新ID為1的記錄就會(huì)發(fā)生阻塞,因?yàn)榧覶M鎖能成功,但是加TX鎖失敗。如果更新的記錄是ID=2那么就是成功的。這是表上就存在多個(gè)TM、TX鎖。如果在表上加上TM鎖成功,那么除了在V$LOCK會(huì)有相應(yīng)的記錄外,V$LOCKED_OBJECT也有相應(yīng)對(duì)象的記錄。
行級(jí)鎖只有排他鎖沒有共享鎖。
另外,select語句不會(huì)添加任何鎖,所以一般的TX,TM鎖都不會(huì)阻塞select語句的執(zhí)行。唯一能阻塞select語句執(zhí)行的是latch鎖,一旦發(fā)生latch鎖阻塞select語句的執(zhí)行,對(duì)系統(tǒng)的正常運(yùn)行非常的大,甚至?xí)?dǎo)致系統(tǒng)的崩潰。
三.示例
示例1:
SQL> update test set segment_name='test' where wner='SYS';
已更新4044行。
SQL> select sid,type,lmode from v$lock where sid=128;
SID TY LMODE
---------- -- ----------
128 TM 3
128 TX 6
SQL> select session_id,locked_mode from v$locked_object;
SESSION_ID LOCKED_MODE
---------- -----------
128 3
示例2:
SQL> select * from test for update;
SQL> select sid,type,lmode from v$lock where sid=36;
SID TY LMODE
---------- -- ----------
36 TM 3
36 TX 6
SQL> select session_id,locked_mode from v$locked_object;
SESSION_ID LOCKED_MODE
---------- -----------
36 3
有時(shí)候查詢v$LOCK會(huì)發(fā)現(xiàn)只有TM鎖,沒有TX鎖,那是因?yàn)樵趫?zhí)行DML語句或select ...for update語句時(shí)操作的記錄是0條,所以只加上了TM鎖,沒有行需要加TX鎖。
四.手動(dòng)添加鎖:
級(jí)別從低到高,SS可以添加除了X其他的所有類型的鎖。而X鎖不能添加其他任何的鎖。
創(chuàng)建索引時(shí)添加的是TM的S鎖,MODE值為4,這個(gè)時(shí)候是不允許執(zhí)行任何的DML語句的,因?yàn)闊o法在表上添加任何其他排它類型的TM鎖。當(dāng)然我們?cè)趧?chuàng)建索引時(shí)可以指定ONLINE關(guān)鍵字,可以避免阻塞DML語句情況的出現(xiàn)。
//行共享 SS
LOCK TABLE TABLE_NAME IN ROW SHARE MODE;
//行排它 SX
LOCK TABLE TABLE_NAME IN ROW EXCLUSIVE MODE;
//共享鎖 S
LOCK TABLE TABLE_NAME IN SHARE MODE;
//共享行排它 SSX
LOCK TABLE TABLE_NAME IN SHARE ROW EXCLUSIVE MODE;
//排它鎖 X
LOCK TABLE TABLE_NAME IN EXCLUSIVE MODE;
通過ROLLBACK或COMMIT來釋放鎖。
五.相關(guān)參數(shù):
dml_locks=0(dml_locks相關(guān)含義請(qǐng)看另一篇文章:http://space.itpub.net/23135684/viewspace-626728)
SQL> update test set segment_name='test' where wner='SYS';
已更新4044行。
SQL> select sid,type,lmode from v$lock where sid=128;
SID TYPE LMODE
---------- ---- ----------
128 TX 6
SQL> select session_id,locked_mode from v$locked_object;
未選定行
SQL> drop table test;
drop table test
*
第 1 行出現(xiàn)錯(cuò)誤:
ORA-00062: 無法獲得 DML 全表鎖定; DML_LOCKS 為 0
由此證明:如果dml_locks=0,那么執(zhí)行dml語句,表級(jí)的TM鎖已經(jīng)不存在了,但是行級(jí)別的TX事務(wù)鎖還是存在的。由于不能在表級(jí)上添加任何鎖,所以更無法執(zhí)行DDL語句對(duì)表進(jìn)行操作。
網(wǎng)頁標(biāo)題:Oracle的鎖機(jī)制原理
分享網(wǎng)址:http://m.newbst.com/article32/eohosc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、網(wǎng)站建設(shè)、全網(wǎng)營銷推廣、標(biāo)簽優(yōu)化、自適應(yīng)網(wǎng)站、網(wǎng)頁設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)