鎖是管理共享資源的併發訪問。
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包進行鎖定