ORACLE 鎖簡單介紹

rainbowbridg發表於2007-03-13
ORACLE 鎖簡單介紹 (zt)

ORACLE (zt)

  ORACLE資料庫是現今資料庫領域應用最廣泛的,同時它也是一個龐大的系統,全面瞭解它、玩轉它不但需要一定的理論知識,更需要開發經驗與工程經驗。本人是ORACLE一愛好者,以下是本人對ORACLE鎖的一些經驗,希望能與大家共同分享。
預備知識:
  DDL(DATABASE DEFINITION LANGUAGE):資料庫定義語言,如create table、drop table.....
  DML(DATABASE MODIFICATION LANGUAGE):資料庫修改語言,如insert、delete、update......
  參考資料:Oracle8 Administrator"s Guide, Release 8.0
      Oracle8 Tuning, Release 8.0
ORACLE鎖具體分為以下幾類:

1.按使用者與系統劃分,可以分為自動與顯示
  自動:當進行一項資料庫操作時,預設情況下,系統自動為此資料庫操作獲得所有有必要的
  顯示:某些情況下,需要使用者顯示的定資料庫操作要用到的資料,才能使資料庫操作執行得更好,顯示是使用者為資料庫物件設定的。
2.按級別劃分,可分為共享與排它
  共享:共享使一個事務對特定資料庫資源進行共享訪問——另一事務也可對此資源進行訪問或獲得相同共享。共享為事務提供高併發性,但如拙劣的事務設計+共享容易造成死或資料更新丟失。
  排它:事務設定排它後,該事務單獨獲得此資源,另一事務不能在此事務提交之前獲得相同物件的共享或排它
3.按操作劃分,可分為DML鎖、DDL鎖
  +DML鎖又可以分為,行、表、死
    -行:當事務執行資料庫插入、更新、刪除操作時,該事務自動獲得操作表中操作行的排它
    -表級:當事務獲得行後,此事務也將自動獲得該行的表(共享),以防止其它事務進行DDL語句影響記錄行的更新。事務也可以在進行過程中獲得共享或排它,只有當事務顯示使用LOCK TABLE語句顯示的定義一個排它時,事務才會獲得表上的排它,也可使用LOCK TABLE顯示的定義一個表級的共享(LOCK TABLE具體用法請參考相關文件)。
    -死:當兩個事務需要一組有衝突的,而不能將事務繼續下去的話,就出現死
        如事務1在表A行記錄#3中有一排它,並等待事務2在表A中記錄#4中排它的釋放,而事務2在表A記錄行#4中有一排它,並等待事務; 1在表A中記錄#3中排它的釋放,事務1與事務2彼此等待,因此就造成了死。死一般是因拙劣的事務設計而產生。死只能使用SQL下:alter system kill session "sid,serial#";或者使用相關作業系統kill程式的命令,如UNIX下kill -9 sid,或者使用其它工具殺掉死程式。
  +DDL鎖又可以分為:排它DDL鎖、共享DDL鎖、分析
    -排它DDL鎖:建立、修改、刪除一個資料庫物件的DDL語句獲得操作物件的 排它。如使用alter table語句時,為了維護資料的完成性、一致性、合法性,該事務獲得一排它DDL鎖。
    -共享DDL鎖:需在資料庫物件之間建立相互依賴關係的DDL語句通常需共享獲得DDL鎖。
如建立一個包,該包中的過程與函式引用了不同的資料庫表,當編譯此包時,該事務就獲得了引用表的共享DDL鎖。
    -分析:ORACLE使用共享池儲存分析與最佳化過的SQL語句及PL/SQL程式,使執行相同語句的應用速度更快。一個在共享池中快取的物件獲得它所引用資料庫物件的分析。分析是一種獨特的DDL鎖型別,ORACLE使用它追蹤共享池物件及它所引用資料庫物件之間的依賴關係。當一個事務修改或刪除了共享池持有分析的資料庫物件時,ORACLE使共享池中的物件作廢,下次在引用這條SQL/PLSQL語句時,ORACLE重新分析編譯此語句。
4.內部閂
  內部閂:這是ORACLE中的一種特殊,用於順序訪問內部系統結構。當事務需向緩衝區寫入資訊時,為了使用此塊記憶體區域,ORACLE首先必須取得這塊記憶體區域的閂,才能向此塊記憶體寫入資訊。
  以上是 本人對ORACLE鎖的一些總結,不足之處還望大家海涵,同時也希望大家多提出自己對ORACLE鎖的一些看法。
ORACLE裡有以下幾種模式

0:none
1:null 空
2:Row-S 行共享(RS):共享表
3:Row-X 行專用(RX):用於行的修改
4:Share 共享(S):阻止其他DML操作
5:S/Row-X 共享行專用(SRX):阻止其他事務操作
6:exclusive 專用(X):獨立訪問使用

數字越大級別越高, 影響的操作越多。

一般的查詢語句如select ... from ... ;是小於2的, 有時會在v$locked_object出現。

select ... from ... for update; 是2的

當對話使用for update子串開啟一個遊標時,
所有返回集中的資料行都將處於行級(Row-X)獨佔式定,
其他物件只能查詢這些資料行,不能進行update、delete或select...for update操作。

insert / update / delete ... ; 是3的

沒有commit之前插入同樣的一條記錄會沒有反應,
因為後一個3的會一直等待上一個3的, 我們必須釋放掉上一個才能繼續工作。

建立索引的時候也會產生3,4級別的

locked_mode為2,3,4不影響DML(insert,delete,update,select)操作,
但DDL(alter,drop等)操作會提示ora-00054錯誤。

有主外來鍵約束時 update / delete ... ; 可能會產生4,5的

DDL語句時是6的

以DBA角色, 檢視當前資料庫裡的情況可以用如下SQL語句:

select object_id,session_id,locked_mode from v$locked_object;

select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;

如果有長期出現的一列,可能是沒有釋放的

我們可以用下面SQL語句殺掉長期沒有釋放非正常的

alter system kill session 'sid,serial#';

如果出現了的問題, 某個DML操作可能等待很久沒有反應。

當你採用的是直接連線資料庫的方式,
也不要用OS系統命令 $kill process_num 或者 $kill -9 process_num來終止使用者連線,
因為一個使用者程式可能產生一個以上的, 殺OS程式並不能徹底清除的問題。

在資料庫級別可用alter system kill session 'sid,serial#';殺掉不正常的
• 鎖型別經常獲取的一些鎖型別如下
– TM 表鎖提供幾個表上的併發訪問
– TX 事務處理鎖或行鎖提供併發訪問行
– MR 介質恢復鎖表明資料庫檔案是聯機的
– ST 空間事務處理鎖表明由於最佳化不良的資料庫中的區正在增長或收
縮SMON 正在合併相鄰的空閒區
ref:
[@more@]

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

相關文章