Oracle的鎖機制

jopen 9年前發布 | 16K 次閱讀 Oracle 數據庫服務器

鎖是防止在兩個事務操作同一個數據源(表或行)時交互破壞數據的一種機制。Oracle采用封鎖技術保證并發操作的可串行性。Oracle的鎖分為兩大 類:數據鎖(也稱DML鎖)和字典鎖。字典鎖是Oracle DBMS內部用于對字典表的封鎖。字典鎖包括語法分析鎖和DDL鎖,由DBMS在必要的時候自動加鎖和釋放鎖,用戶無機控制。

Oracle主要提供了5種數據鎖:共享鎖(Share Table Lock,簡稱S鎖)、排它鎖(Exclusive Table Lock,簡稱X鎖)、行級鎖(Row Share Table Lock,簡稱RS鎖)、行級排它鎖(Row Exclusive Table Lock,簡稱RX鎖)和共享行級排它鎖(Share Row Exclusive Table Lock,簡稱SRX鎖)。其封鎖粒度包括行級和表級。

1. 共享鎖(Share Table Lock,S):

加鎖語法:Lock Table TableName In Share Mode;

允許的操作:一個共享鎖由一個事務控制,僅允許其它事務查詢被鎖定的表。一個有效的共享鎖明確地用Select … For update形式鎖定行,或執行Lock Table TableName In Share Mode語法鎖定整個表,不允許被其它事務更新。允許多個事務在同一個表上加共享鎖,這種情況下不允許在該表上加鎖的事務更新表(即使有一個事務控制的是 形如Select Row … for update這樣行鎖也是不被允許的)。因此,僅有一個事務的一個共享鎖可以更新該表如果其它事務也有相同的事務在該表上的話。

禁止的操作:一個共享鎖由一個事務來控制,防止其它事務更新該表或執行下面的語句:

LOCK TABLE TableName IN SHARE ROW EXCLUSIVE MODE;

LOCK TABLE TableName IN ROW EXCLUSIVE MODE;

2. 排它鎖(Exclusive Table Lock,X):

排它鎖是在鎖機制中限制最多的一種鎖類型,允許加排它鎖的事務獨自控制對表的寫權限。

加鎖語法:Lock Table TableName In Exclusive Mode;

允許的操作:在一個表中只能有一個事務對該表實行排它鎖,排它鎖僅允許其它的事務查詢該表。

禁止的操作:擁有排外鎖的事務禁止其它事務執行其它任何DML類型的語句或在該表上加任何其它類型的鎖。

定義排它鎖的語法:

LOCK TABLE TableName IN EXCLUSIVE MODE;

3. 行級鎖(Row Share Table Lock,RS):

一個行級鎖(有時稱為Subshare Table Lock,簡稱SS,子共享鎖)需要該事務在被鎖定行的表上用update的形式加鎖。當有下面語句被執行的時候行級鎖自動加在操作的表上。

SELECT . . . FROM TableName. . . FOR UPDATE OF . . . ;

LOCK TABLE TableName IN ROW SHARE MODE;

行級鎖(Row Share Table Lock)在鎖類型中是限制最少的,也是在表的并發程度中使用程度最高的。

允許的操作:行級共享鎖由一個事務控制,允許其它事務查詢、插入、更新、刪除或同時在同一張表上鎖定行。因此其它事務可以同時在同一張表上得到行級鎖、共享行級排它鎖、行級排它鎖、排它鎖。參見數據鎖的相容矩陣圖

禁止的操作:擁有行級鎖的事務不允許其它事務執行排它鎖,即:

Lock Table TableName In Exclusive Mode;

4. 行級排它鎖(Row Exclusive Table Lock,RX):

行級排它鎖(亦稱為Subexclusive Table Lock,簡稱SX,子排它鎖)通常需要事務擁有的鎖在表上被更新一行或多行。當有下面語句被執行的時候行級排它鎖被加在操作的表上。

INSERT INTO TableName. . . ;

UPDATE TableName. . . ;

DELETE FROM TableName. . . ;

LOCK TABLE TableName IN ROW EXCLUSIVE MODE;

行級排它鎖比行級鎖稍微多一些限制。

允許的操作:在數據鎖的相容矩陣圖很容易看出行級排它鎖由一個事務擁有允許其它事務執行查詢、修改、插入、刪除或同時在同一張表上鎖定行。執有行級排它鎖的事務允許其它事務在同一張表上同時得到共享鎖和行級排它鎖。

禁止的操作:行級排它鎖由一個事務擁有防止其它事務手動鎖定表來排除其它事務的讀寫權。因此,其它事務不允許在同一張表上使用以下的語句來執行鎖事務。

LOCK TABLE table IN SHARE MODE;

LOCK TABLE table IN SHARE EXCLUSIVE MODE;

LOCK TABLE table IN EXCLUSIVE MODE

5. 共享行級排它鎖(Share Row Exclusive Table Lock,SRX):

共享行級排它鎖有時也稱共享子排它鎖(Share Subexclusive Table Lock,SSX),它比共享鎖有更多限制。定義共享行級排它鎖的語法為:

Lock Table TableName In Share Row Exclusive Mode;

允許的操作:僅允許一個事務在某一時刻得到行級排它鎖。擁有行級排它鎖事務允許其它事務在被鎖定的表上執行查詢或使用Select … From TableName For update…來準確在鎖定行而不能更新行。

禁止的操作:擁有行級排它鎖的事務不允許其它事務有除共享鎖外的其它形式的鎖加在同一張表上或更新該表。即下面的語句是不被允許的:

LOCK TABLE TableName IN SHARE MODE;

LOCK TABLE TableName IN SHARE ROW EXCLUSIVE MODE;

LOCK TABLE TableName IN ROW EXCLUSIVE MODE;

LOCK TABLE TableName IN EXCLUSIVE MODE;

DML語句獲得的DML自動鎖(Oracle隱含鎖)

DML自動鎖的相容矩陣圖:

X:排它鎖、RS:行級共享鎖、RX:行級排它鎖、S、共享鎖、RSX:行級共享排它鎖

DML語句 有行級鎖 鎖類型

SELECT ... FROM table

INSERT INTO table ... X RX

UPDATE table ... X RX

DELETE FROM table ... X RX

SELECT ... FROM table ... FOR UPDATE OF ... X RS

LOCK TABLE table IN ...

ROW SHARE MODE RS

ROW EXCLUSIVE MODE RX

SHARE MODE S

SHARE EXCLUSIVE MODE SRX

EXCLUSIVE MODE X

數據字典中與鎖有關的表或視圖

V_$LOCKED_OBJECT

V_$LOCKS_WITH_COLLISIONS

V_$LOCK_ACTIVITY

V_$LOCK_ELEMENT

V_$_LOCK

DBMS_LOCK

V$DLM_ALL_LOCKS

V$DLM_LOCKS

V$ENQUEUE_LOCK

V$GLOBAL_BLOCKED_LOCKS

V$LOCK

V$LOCKED_OBJECT

V$LOCKS_WITH_COLLISIONS

V$LOCK_ACTIVITY

V$LOCK_ELEMENT

V$_LOCK

解鎖及Kill Session:

使用下面的語法查出鎖并殺掉Session。

SELECT A.SID,A.SERIAL#,A.USERNAME,B.TYPE FROM V$SESSION A,V$LOCK B WHERE A.SID=B.SID;

ALTER SYSTEM KILL SESSION 'SID,SERIAL#';

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!