鎖是對資料進行併發控制的機制




鎖的類型

 

根據許可權劃分:

 

排他鎖(Exclusive Lock)




又稱為 X 鎖或寫鎖

 

若事務 T1 對資源 R 加上 X 鎖,則只允許 T1 讀取和修改 R,其它事務可以讀取 R,但不能修改 R,除非 T1 事務解除了加在 R 上的 X 鎖。

 

共用鎖(Share Lock)

 

又稱為 S 鎖或讀鎖

 

若事務 T2 對資源 R 加上 S 鎖,允許 T2 讀取 R,其它事務也可以讀取 R。






對於一行或一個完整表上的排他鎖來說,每次只能有一個會話可以獲得這個排他鎖,不過許多會話可以同時獲得同一物件上的共用鎖。

 

在一行上設置共用鎖毫無意義,其原因在於鎖定一行的唯一目的就是不允許其它會話更改它。

 

共用鎖被置於整個表上,同時許多會話可以獲得同一個表上的共用鎖。

 

在一個表上放置共用鎖的目的是為了防止另一個會話獲得這個表上的排它鎖(在已存在共用鎖的情況下無法再獲得排他鎖)。

 

在表上放置排他鎖時需要執行 DDL 語句,如果其它會話已經在一個表上放置了共用鎖,那麼我們無法執行修改某個物件的語句(例如刪除表的一列)。




所有 DML 語句至少都需要兩種鎖:

 

受影響記錄上的排他鎖

 

受影響記錄的表上的共用鎖

 

排他鎖能夠防止其它會話干預指定行

 

共用鎖能夠防止其它會話使用 DDL 語句修改表的定義






執行 DDL 命令需要使用所涉及物件上的排他鎖,只有在針對指定表的所有 DML 事務結束,且行上的排他鎖及表上的共用鎖都被解除後,才可以獲得執行 DDL 命令所需的排他鎖。




根據資源劃分:

 

資料鎖(Data Lock)

 

當使用者對表中的資料進行 INSERT、UPDATE 和 DELETE 操作時將用到資料鎖,資料鎖在表中獲得並保護資料。

 

字典鎖(Dictionary Lock)

 

當使用者創建、修改和刪除表時將用到字典鎖,字典鎖用來防止兩個使用者同時修改同一個表的結構。

 

內部鎖

 

分佈鎖

 

並行緩衝管理鎖




查詢鎖資訊




SQL> DESC v$lock

 

Name Null? Type

 

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

 

ADDR RAW(8)

 

KADDR RAW(8)

 

SID NUMBER

 

TYPE VARCHAR2(2)

 

ID1 NUMBER

 

ID2 NUMBER

 

LMODE NUMBER

 

REQUEST NUMBER

 

CTIME NUMBER

 

BLOCK NUMBER




加鎖的方法

 

行共用鎖 RS (Row Share)

 

對表定義行共用鎖後,如果被事務 A 獲得,那麼其它事務可以進行併發查詢、插入、刪除和加鎖,但不能以排他方式存取該表。

 

行排他鎖 RX (Rou Exclusive)

 

對表定義行排他鎖後,如果被事務 A 獲得,那麼 A 事務對表中的行資料具有排他權利,其它事務可以對統一表中的其它資料進行併發查詢、插入、修改、刪除及加鎖,但不能使用以下 3 中方式加鎖。

 

|- 行共用鎖

 

|- 共用行排他鎖

 

|- 行排他鎖

 

共用鎖 S (Share)




對表定義共用鎖後,如果被事務 A 獲得,其它事務可以執行併發查詢和加共用鎖但不能修改表,也不能使用以下 3 種方式加鎖。




|- 排他鎖

 

|- 共用行排他鎖

 

|- 行排他鎖

 

共用行排他鎖 SRX (Share Row Exclusive)






對表定義共用行排他鎖後,如果被事務 A 獲得,其它事務可以執行查詢和對其它資料行進行加鎖,但不能修改表,也不能使用以下 4 中方式加鎖。

 

|- 共用鎖

 

|- 共用行排他鎖

 

|- 行排他鎖

 

|- 排他鎖

 

排他鎖 X (Exclusive)




排他鎖是最嚴格的鎖,如果被事務 A 獲得,A 可以執行對資料表的讀寫操作,其它事務可以執行查詢但不能執行插入、修改和刪除操作。
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()