中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Oracle的鎖機制原理

發布時間:2021-08-16 21:18:21 來源:億速云 閱讀:125 作者:chen 欄目:建站服務器

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


一.ORACLE中有關鎖的動態性能視圖主要有:

V$LOCK
This view lists the locks currently held by the Oracle Database and outstanding requests for a lock or latch.
        TM鎖的ID1字段表示對象的ID號,可以通過DBA_OBJECTS.OBJECT_ID來查到具體的對象。
        TX鎖的ID1代表的是事務的回滾段回滾段號、事務槽號,ID2代表的是順序號。(V$TRANSACTION.XIDSQN表示事務槽號)
有關VLOCK.ID1和ID2的含義可參考文章:http://space.itpub.net/?uid-23135684-action-viewspace-itemid-715468

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

通過查詢V$SESSION.BLOCKING_SESSION_STATUS,v$SESSION.BLOCKING_SESSION兩個字段也可以查看到阻塞其他的會話。


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

查找阻塞事務的事務會話信息:
select * from v$lock where (id1,id2)=(select id1,id2 from v$lock where sid= 被鎖的會話的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的相關信息。

主要的有:
TM - DML enqueue

TX - Transaction enqueue

UL - User supplied

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

從Oracle 11g開始,每個登錄的會話都會有一個默認的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鎖,是表級上的鎖。TX是事務鎖,是行級鎖。在執行DML操作時,先對表加TM鎖,如果加鎖成功,然后再加TX鎖。一般情況下,一個會話中,只會出現一個TX鎖,可能有多個TM鎖,這些TM所共享一個TX鎖。不同的語句加TM鎖的類型不同,類型就是下面說的LOCK MODE。在表級上加了TM鎖也是為了防止其他會話再在表上加上排它鎖(例如對表執行DDL語句)。一個表上可以加上多個TM鎖、TX鎖的。例如,A會話更新了TEST表上ID號為1的一條記錄,首先會先在這個表上加上一個TM鎖,加鎖成功,會在ID為1的行上加上一個TX鎖。如果有另外一個會話來同樣來更新ID為1的記錄就會發生阻塞,因為加TM鎖能成功,但是加TX鎖失敗。如果更新的記錄是ID=2那么就是成功的。這是表上就存在多個TM、TX鎖。如果在表上加上TM鎖成功,那么除了在V$LOCK會有相應的記錄外,V$LOCKED_OBJECT也有相應對象的記錄。

行級鎖只有排他鎖沒有共享鎖。

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

三.示例

示例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

有時候查詢v$LOCK會發現只有TM鎖,沒有TX鎖,那是因為在執行DML語句或select ...for update語句時操作的記錄是0條,所以只加上了TM鎖,沒有行需要加TX鎖。

四.手動添加鎖:

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

//行共享 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來釋放鎖。

五.相關參數:

dml_locks=0(dml_locks相關含義請看另一篇文章: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: 無法獲得 DML 全表鎖定; DML_LOCKS 為 0

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

到此,相信大家對“Oracle的鎖機制原理”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大荔县| 台北县| 沛县| 阜平县| 鄯善县| 万宁市| 临夏县| 简阳市| 汶上县| 门源| 麻江县| 剑川县| 武夷山市| 城固县| 桦川县| 志丹县| 三原县| 巴彦淖尔市| 大荔县| 芮城县| 屏南县| 泗水县| 开封市| 鲁山县| 玉山县| 洛宁县| 北安市| 双辽市| 时尚| 玛沁县| 怀集县| 昌乐县| 玉林市| 青州市| 湾仔区| 兴山县| 穆棱市| 措美县| 原平市| 高要市| 靖远县|