dml鎖(dml lock) :
dml代表資料操縱語言(data manipulation language) 。一般來講,
這表示 select、insert、update、merge 和 delete 語句。dml 鎖機制允許併發執行數
據修改。例如,dml鎖可能是特定資料行上的鎖,或者是鎖定表中所有行的表級鎖。
1.tx事務鎖
事務發起第乙個修改時會得到 tx 鎖(事務鎖),而且會一直持有這個鎖,直至事務執行提交(commit)或回滾(rollback) 。tx鎖用作一種排隊機制,使得其他會話可以等待這個事務執行。事務中修改或通過select for update選擇的每一行都會「指向」該事務的乙個相關tx鎖。
oracle並 沒有乙個傳統的鎖管理器,不會用鎖管理器為系統中鎖定的每一行維護乙個長長的列表。不過,其他的許多資料庫卻是這樣做的,因為對於這些資料庫來說,鎖是一 種稀有資源,需要對鎖的使用進行監視。使用的鎖越多,系統要管理的方面就越多,所以在這些系統中,如果使用了「太多的」鎖就會有問題。
如果資料庫中有乙個傳統的基於記憶體的鎖管理器,在這樣乙個資料庫中,對一行鎖定的過程一般如下:
(1) 找到想鎖定的那一行的位址。
(2) 在鎖管理器中排隊(鎖管理器必須是序列化的,因為這是乙個常見的記憶體中的結構)。
(3) 鎖定列表。
(4) 搜尋列表,檢視別人是否已經鎖定了這一行。
(5) 在列表中建立乙個新的條目,表明你已經鎖定了這一行。
(6) 對列表解鎖。
既然已經鎖定了這一行,接下來就可以修改它了。之後,在你提交修改時,必須繼續這個過程,如下:
(7) 再次排隊。
(8) 鎖住鎖的列表。
(9) 在這個列表中搜尋,並釋放所有的鎖。
(10) 對列表解鎖。
可以看到,得到的鎖越多,這個操作所花的時間就越多,修改資料前和修改資料之後耗費的時間都會增加。oracle 不是這樣做的。oracle中的鎖定過程如下:
(1) 找到想鎖定的那一行的位址。
(2) 到達那一行。
(3) 鎖定這一行(如果這一行已經鎖定,則等待鎖住它的事務結束,除非使用了nowait選項)
僅此而已。由於閂為資料的乙個屬性,oracle不需要傳統的鎖管理器。事務只是找到資料[5],如果資料還沒有被鎖定,則對其鎖定。有意思的是,找到資料時,它可能看上去被鎖住了,但實際上並非如此。在oracle中對資料行鎖定時,行指向事務id的乙個副本,事務id儲存在包含資料的塊中,釋放鎖時,事務id卻會保留下來。這個事務id是事務所獨有的,表示了回滾段號、槽和序列號。事務id留在包含資料行的塊上,可以告訴其他會話:你「擁有」這個資料(並非塊上的所有資料都是你的,只是你修改的那一行「歸你所有」) 。另乙個會話到來時,它會看到鎖id,由於鎖id表示乙個事務,所以可以很快地檢視持有這個鎖的事務是否還是活動的。如果鎖不活動,則允許會話訪問這個資料。如果鎖還是活動的,會話就會要求一旦釋放鎖就得到通知。因此,這就有了乙個排隊機制:請求鎖的會話會排隊,等待目前擁有鎖的事務執行,然後得到資料。
2. tm (dml enqueue)鎖
drop table dept
* error at line 1:
ora-00054: resource busy and acquire with nowait specified
儘管每個事務只能得到乙個tx鎖,但是tm 鎖則不同,修改了多少個物件,就能得到多少個tm 鎖。
系統中允許的 tm 鎖總數可以由你來配置(有關細節請見
oracle database reference手冊中的dml_locks 引數定義) 。實際上,這個數可能設定為0。但這並不是說你的資料庫變成了乙個唯讀資料庫(沒有鎖) ,而是說不允許ddl。在非常專業的應用(如rac實現)中,這一點就很有用,可以減少例項內可能發生的協調次數。通過使用 alter table tablename disable table lock命令,還可以逐物件地禁用tm 鎖。這是一種快捷方法,可以使意外刪除表的「難度更大」,因為在刪除表之前,你必須重新啟用表鎖。還能用它來檢測由於外來鍵未加索引而導致的全表鎖。
ddl鎖
在 ddl 操作中會自動為物件加 ddl 鎖(ddl lock) ,從而保護這些物件不會被其他會話所修改。
例如,如果我執行乙個ddl 操作altertable t,表t上就會加乙個排他ddl鎖,以防止其他會話得到這個表的ddl 鎖和tm 鎖。 在ddl語句執行期間會一直持有ddl鎖, 一旦操作執行就立即釋放ddl鎖。實際上, 通常會把ddl語句包裝在隱式提交 (或提交/回滾對) 中來執行這些工作。
有3種型別的 ddl鎖:
排他ddl鎖 (exclusive ddl lock) : 這會防止其他會話得到它們自己的ddl鎖或 tm (dml)鎖。這說明,在ddl操作期間你可以查詢乙個表,但是無法以任何方式修改這個表。
共享ddl鎖(share ddl lock) :這些鎖會保護所引用物件的結構,使之不會被其他會話修改,但是允許修改資料。
可中斷解析鎖(breakable parse locks) :這些鎖允許乙個物件(如共享池中快取的乙個查詢計畫)向另外某個物件註冊其依賴性。如果在被依賴的物件上執行ddl,oracle會檢視已經對該物件註冊了依賴性的物件列表,並使這些物件無效。因此,這些鎖是「可中斷的」,它們不能防止ddl出現。
閂閂(latch)是輕量級的序列化裝置,用於協調對共享資料結構、物件和檔案的多使用者訪問。
閂就是一種鎖,設計為只保持極短的一段時間(例如,修改乙個記憶體中資料結構所需的時間) 。閂用於保護某些記憶體結構,如資料庫塊緩衝區快取或共享池中的庫快取。一般會在內部以一種「願意等待」(willing to wait)模式請求閂。這說明,如果閂不可用,請求會話會睡眠很短的一段時間,並在以後再次嘗試這個操作。還可以採用一種「立即」 (immediate)模式請求其他閂,這與 select for update nowait的 思想很相似,說明這個程序會做其他事情(如獲取另乙個與之相當的空閒閂) ,而不只是坐而等待這個閂直到它可用。由於許多請求者可能會同時等待乙個閂,你會 看到一些程序等待的時間比其他程序要長一些。閂的分配相當隨機,這要看運氣好壞了。閂釋放後,緊接著不論哪個會話請求閂都會得到它。等待閂的會話不會排 隊,只是一大堆會話在不斷地重試。
注意閂的自旋。
Oracle資料庫的鎖型別
oracle 中的鎖 鎖是資料庫用來控制共享資源併發訪問的機制。鎖用於保護正在被修改的資料 直到提交或回滾了事務之後,其他使用者才可以更新資料 鎖的特性 一致性 一次只允許乙個使用者修改資料 完整性 為所有使用者提供正確的資料。如果乙個使用者進行了修改並儲存,所做的修改將反映給所有使用者 並行性 允...
oracle中查詢鎖表
查詢表被鎖住 查詢被鎖的表 select b.owner,b.object name,a.session id,a.locked mode from v locked object a,dba objects b where b.object id a.object id 檢視是哪個session引...
ORACLE中的INTERVAL型別
oracle中的interval型別 interval資料型別用來儲存兩個時間戳之間的時間間隔。可以指定years and months,或者days,hours,minuts,seconds之間的間隔。oracle支援兩種inteval型別,它們分別是year to month和day to se...