国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Oracle的鎖機制原理

發(fā)布時(shí)間:2021-08-17 12:35 來(lái)源:億速云 閱讀:0 作者:chen 欄目: 服務(wù)器 歡迎投稿:712375056

本篇內容主要講解“Oracle的鎖機制原理”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強。下面就讓小編來(lái)帶大家學(xué)習“Oracle的鎖機制原理”吧!


一.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字段表示對象的ID號,可以通過(guò)DBA_OBJECTS.OBJECT_ID來(lái)查到具體的對象。
        TX鎖的ID1代表的是事務(wù)的回滾段回滾段號、事務(wù)槽號,ID2代表的是順序號。(V$TRANSACTION.XIDSQN表示事務(wù)槽號)
有關(guān)VLOCK.ID1和ID2的含義可參考文章:http://space.itpub.net/?uid-23135684-action-viewspace-itemid-715468

BLOCK字段如果等于1的話(huà),表示此鎖阻塞了其他DML語(yǔ)句的執行,正常應該為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表示沒(méi)有阻塞,而不是表示沒(méi)有鎖。
如果要查詢(xún)是否有會(huì )話(huà)阻塞了其他會(huì )話(huà):
SELECT * FROM V$LOCK WHERE BLOCK=1;

通過(guò)查詢(xún)V$SESSION.BLOCKING_SESSION_STATUS,v$SESSION.BLOCKING_SESSION兩個(gè)字段也可以查看到阻塞其他的會(huì )話(huà)。


如果LMODE為0,REQUEST大于1,表示在獲取鎖的時(shí)候失敗,發(fā)生了相應鎖的阻塞。例如,在執行DML語(yǔ)句時(shí),如果TYPE=TM,LMODE=0,REQUEST=3,就表示此DML語(yǔ)句在獲取表的TM鎖的行排它鎖時(shí)被阻塞,處于等待狀態(tài)。

查找阻塞事務(wù)的事務(wù)會(huì )話(huà)信息:
select * from v$lock where (id1,id2)=(select id1,id2 from v$lock where sid= 被鎖的會(huì )話(huà)的SID)

V$LOCKED_OBJECT
This view lists all locks acquired by every transaction on the system.

V$LOCK_TYPE

二.其中我們主要查看的是:

LOCK TYPE(按對象劃分)

V$LOCK_TYPE保存了所有的LOCK TYPE的相關(guān)信息。

主要的有:
TM - DML enqueue

TX - Transaction enqueue

UL - User supplied

MR -Media Recovery
MR鎖用于保護數據文件,使得文件在數據庫打開(kāi)、表空間Online時(shí)不能執行恢復。當進(jìn)程對數據文件進(jìn)行恢復時(shí),需要排他的獲得MR鎖。當數據庫打開(kāi)時(shí),每個(gè)文件上都分配一個(gè)MR鎖。ID1代表文件號,也包含了201臨時(shí)文件。

從Oracle 11g開(kāi)始,每個(gè)登錄的會(huì )話(huà)都會(huì )有一個(gè)默認的AE鎖。

LOCK MODE(按類(lèi)型劃分)

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也能看出按類(lèi)型分鎖只有2種,共享(S),排它(X),把他們不同的組合就成了不同的LOCK MODE了。如果添加的是X鎖,那么其他任何鎖也不能再添加到此行或表上了。

TM就是DML鎖,是表級上的鎖。TX是事務(wù)鎖,是行級鎖。在執行DML操作時(shí),先對表加TM鎖,如果加鎖成功,然后再加TX鎖。一般情況下,一個(gè)會(huì )話(huà)中,只會(huì )出現一個(gè)TX鎖,可能有多個(gè)TM鎖,這些TM所共享一個(gè)TX鎖。不同的語(yǔ)句加TM鎖的類(lèi)型不同,類(lèi)型就是下面說(shuō)的LOCK MODE。在表級上加了TM鎖也是為了防止其他會(huì )話(huà)再在表上加上排它鎖(例如對表執行DDL語(yǔ)句)。一個(gè)表上可以加上多個(gè)TM鎖、TX鎖的。例如,A會(huì )話(huà)更新了TEST表上ID號為1的一條記錄,首先會(huì )先在這個(gè)表上加上一個(gè)TM鎖,加鎖成功,會(huì )在ID為1的行上加上一個(gè)TX鎖。如果有另外一個(gè)會(huì )話(huà)來(lái)同樣來(lái)更新ID為1的記錄就會(huì )發(fā)生阻塞,因為加TM鎖能成功,但是加TX鎖失敗。如果更新的記錄是ID=2那么就是成功的。這是表上就存在多個(gè)TM、TX鎖。如果在表上加上TM鎖成功,那么除了在V$LOCK會(huì )有相應的記錄外,V$LOCKED_OBJECT也有相應對象的記錄。

行級鎖只有排他鎖沒(méi)有共享鎖。

另外,select語(yǔ)句不會(huì )添加任何鎖,所以一般的TX,TM鎖都不會(huì )阻塞select語(yǔ)句的執行。唯一能阻塞select語(yǔ)句執行的是latch鎖,一旦發(fā)生latch鎖阻塞select語(yǔ)句的執行,對系統的正常運行非常的大,甚至會(huì )導致系統的崩潰。

三.示例

示例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í)候查詢(xún)v$LOCK會(huì )發(fā)現只有TM鎖,沒(méi)有TX鎖,那是因為在執行DML語(yǔ)句或select ...for update語(yǔ)句時(shí)操作的記錄是0條,所以只加上了TM鎖,沒(méi)有行需要加TX鎖。

四.手動(dòng)添加鎖:

級別從低到高,SS可以添加除了X其他的所有類(lèi)型的鎖。而X鎖不能添加其他任何的鎖。
創(chuàng )建索引時(shí)添加的是TM的S鎖,MODE值為4,這個(gè)時(shí)候是不允許執行任何的DML語(yǔ)句的,因為無(wú)法在表上添加任何其他排它類(lèi)型的TM鎖。當然我們在創(chuàng )建索引時(shí)可以指定ONLINE關(guān)鍵字,可以避免阻塞DML語(yǔ)句情況的出現。

//行共享 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;

通過(guò)ROLLBACK或COMMIT來(lái)釋放鎖。

五.相關(guān)參數:

dml_locks=0(dml_locks相關(guān)含義請看另一篇文章: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 行出現錯誤:
ORA-00062: 無(wú)法獲得 DML 全表鎖定; DML_LOCKS 為 0

由此證明:如果dml_locks=0,那么執行dml語(yǔ)句,表級的TM鎖已經(jīng)不存在了,但是行級別的TX事務(wù)鎖還是存在的。由于不能在表級上添加任何鎖,所以更無(wú)法執行DDL語(yǔ)句對表進(jìn)行操作。

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

亚洲欧美综合在线天堂| 亚洲 欧美 日韩 国产 丝袜| 久久天天躁狠狠躁夜夜AV| 久久香蕉超碰97国产精品| 亚洲中文字幕精品久久久久久动漫| 少妇人妻激情乱人伦|