oracle的鎖

追求完美9196發表於2024-06-10

鎖是管理共享資源的併發訪問。

1 關於鎖的衍生概念

1.1 悲觀鎖

悲觀鎖是認為資料會被其他會話同時修改。所以在資料修改前,先對資料鎖定,然後再修改資料。例如,先對某一行資料進行for update鎖定,然後再更新這一行的資料。
Select * from table where primary_key = :primary_key And decode( columnl, :old_columnl, 1)=1 And decode( column2, :old_column2, 1)=1 For update;
Update table Set columnl = :new_columnl, column= :new_column2, Where primary_key = :primary_key;
Commit;

1.2 樂觀鎖

樂觀鎖是認為資料不會別其他會話同時修改。所以只有在執行修改資料語句時才對資料進行鎖定。例如,對某一行資料直接進行修改
Update table Set columnl = :new_columnl, column= :new_column2 Where primary_key = :primary_key And decode( columnl, :old_columnl, 1)=1 And decode( column2, :old_column2, 1)=1;

1.3 阻塞

當一個會話持有某個資源,另一個會話訪問這個這個資源時,就會出現阻塞。

1.4 死鎖

兩個會話互相等待對方釋放資源就會出現死鎖。

2 oracle鎖型別

2.1 DML鎖

當執行select,update,insert,delete,merge時對資料的鎖定就屬於DML鎖。DML鎖分為TX鎖和TM鎖。

2.1.1 TX鎖

TX鎖是一個行級鎖。當事務獲取到TX鎖時,會一直持有,直到事務結束。在oracle中,鎖是資料的一個屬性。事務對行資料鎖定時,行會對應一個事務ID,這個事務ID存放在塊中。別的事務訪問同樣的行時,會檢視行對應的事務id,檢查事務是否是活動的。如果事務活動,則等待事務結束,要求原來的事務一旦釋放鎖,進行通知。所以會有一個鎖的排隊佇列。如果事務不活動,則對行進行鎖定,獲得TX鎖。

2.1.2 TM鎖

TM鎖是資料進行DML操作時,會對錶進行鎖定,防止其他會話修改表結構。

2.2 DDL鎖

當執行DDL操作時,操作的物件就會產生DDL鎖,防止其他會話修改操作物件的結構

3 閂

閂是對orale記憶體結構保護的一種序列化裝置。用於對資料庫快取記憶體、共享池等記憶體結構併發訪問的協調管理。例如一個查詢的硬解釋,就會用到閂。一個會話對某個記憶體結構進行修改時,其他會話無法對該記憶體結構進行讀取。當一個會話釋放閂時,閂的分配是隨機,每個請求閂的起他會話都有可能獲取到閂。等待閂的會話不會排隊,只是不斷進行重試。

4 閂和佇列鎖區別

佇列鎖允許會話以佇列的方式等待釋放鎖,會發生堵塞。而對於閂,如果會話不能獲取到閂,不是等待閂的釋放,而是稍後重試,嘗試得到閂。

5 手動鎖定和使用者定義鎖

5.1 手動鎖定

當我們先手動鎖定一些行資料時,可以使用select ...for update的方式進行鎖定。其他會話就無法修改我們select選中的資料

5.2 使用者定義鎖

當我們需要鎖定一些oracle資料外部的資源時,例如外部檔案。可以透過DBMS_LOCK包進行鎖定

相關文章