鎖--筆記

like052629發表於2015-01-26
鎖:
如果系統平時執行正常,突然停止不動,多半是被阻塞了(blocked),可以首先檢視下v$lock這張檢視:
select sid,type,id1,id2,lmode,request,block from v$lock l where l.block=1;
  SID TYPE ID1 ID2 LMODE REQUEST BLOCK
4 TX 524319 1333 6 0 1           --當前持有lmod=6的會話阻塞其他會話
按照Oracle官方文件說明:如果某個SID的request列是一個非0值,那麼它就是在等待一個鎖,如果block列是1,這個SID就是在持有一個鎖,並且阻塞
別人獲得這個鎖。鎖的型別由TYPE欄位定義,鎖的模式由LMODE欄位定義,ID1、ID2欄位定義了這個鎖的相關資訊。
ID1、ID2構成了在事務中回滾段的位置,用處為,當其他操作需要讀取這個資料塊時,它會發現這個塊上要讀取的資料上是有活動的事務,,因此需要
到回滾段中去找它之前的內容。對於TM鎖,ID1值就是加鎖的段的物件,可以是一個表,也可以是一個表的分割槽,此時ID2一般為2.


Lock identifier #2 (depends on type)
  ---當lock type 為TM時,id1為DML-locked object的object_id
  ---當lock type 為TX時,id1為usn+slot,而id2為seq。
  ---當lock type為其它時,不用關注
  
TM鎖 表級(段)共享鎖 lmod=3持有 不允許使用者對錶做DDL操作
TX鎖 行級排它鎖 Row-X(SX)鎖 lmod=6(X) 在提交前不允許做DML


鎖的級別越高,限制越多。
表1 Oracle的TM鎖型別
鎖模式 鎖描述 解釋 SQL操作
0 none
1 NULL 空 Select
2 SS(Row-S) 行級共享鎖,其他物件只能查詢這些資料行 Select forupdate、Lock for update、Lock row share
3 SX(Row-X) 行級排它鎖,在提交前不允許做DML操作 Insert、Update、Delete、Lock row share
4 S(Share) 共享鎖 Createindex、Lock share
5 SSX(S/Row-X) 共享行級排它鎖 Lock share row exclusive
6 X(Exclusive) 排它鎖 Alter table、Drop able、Drop index、Truncate

鎖是以資料塊的一個屬性存在的,即每個資料塊本身就儲存著自己資料塊中資料的資訊:ITL(Interested Transaction List),凡是這個資料塊上有
活動的事務,資訊就會記錄在這裡面供後續的操作查詢,以保證事務的一致性。


TX並非都是在對資料修改的時候才會產生,只要需要維護事務一致性的時候,就需要用到這個鎖。如分散式事務,一般來說透過dblink在幾個資料庫中
處理資料,因為是分散式的操作方式,所以需要一個事務的總協調者,這時,即使都是讀取操作,依然需要一個TX鎖來維護事務的一致性。




Latch:
是一種輕量級的鎖,不會造成阻塞,只會造成等待。阻塞,是一種系統設計上的問題;等待是一種系統資源爭用的問題。
兩類最常用的Lacth爭用:
共享池中的Latch爭用;資料緩衝池中的Latch爭用。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28258625/viewspace-1415754/,如需轉載,請註明出處,否則將追究法律責任。

相關文章