国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

Oracle 鎖簡單介紹

2024-08-29 13:39:13
字體:
供稿:網(wǎng)友

  Oracle數(shù)據(jù)庫是現(xiàn)今數(shù)據(jù)庫領(lǐng)域應(yīng)用最廣泛的,同時它也是一個龐大的系統(tǒng),全面了解它、玩轉(zhuǎn)它不但需要一定的理論知識,更需要開發(fā)經(jīng)驗(yàn)與工程經(jīng)驗(yàn)。本人是ORACLE一愛好者,以下是本人對ORACLE鎖的一些經(jīng)驗(yàn),希望能與大家共同分享。
  
  預(yù)備知識:
  DDL(DATABASE DEFINITION LANGUAGE):數(shù)據(jù)庫定義語言,如create table、drop table.....
  DML(DATABASE MODIFICATION LANGUAGE):數(shù)據(jù)庫修改語言,如insert、delete、update......
  參考資料:Oracle8 Administrator"s Guide, Release 8.0
  Oracle8 Tuning, Release 8.0
  
  ORACLE鎖具體分為以下幾類:
  1.按用戶與系統(tǒng)劃分,可以分為自動鎖與顯示鎖
  自動鎖:當(dāng)進(jìn)行一項(xiàng)數(shù)據(jù)庫操作時,缺省情況下,系統(tǒng)自動為此數(shù)據(jù)庫操作獲得所有有必要的鎖。
  
  顯示鎖:某些情況下,需要用戶顯示的鎖定數(shù)據(jù)庫操作要用到的數(shù)據(jù),才能使數(shù)據(jù)庫操作執(zhí)行得更好,顯示鎖是用戶為數(shù)據(jù)庫對象設(shè)定的。
  
  2.按鎖級別劃分,可分為共享鎖與排它鎖
  共享鎖:共享鎖使一個事務(wù)對特定數(shù)據(jù)庫資源進(jìn)行共享訪問——另一事務(wù)也可對此資源進(jìn)行訪問或獲得相同共享鎖。共享鎖為事務(wù)提供高并發(fā)性,但如拙劣的事務(wù)設(shè)計(jì)+共享鎖輕易造成死鎖或數(shù)據(jù)更新丟失。
  
  排它鎖:事務(wù)設(shè)置排它鎖后,該事務(wù)單獨(dú)獲得此資源,另一事務(wù)不能在此事務(wù)提交之前獲得相同對象的共享鎖或排它鎖。
  
  3.按操作劃分,可分為DML鎖、DDL鎖
  +DML鎖又可以分為,行鎖、表鎖、死鎖
  
  -行鎖:當(dāng)事務(wù)執(zhí)行數(shù)據(jù)庫插入、更新、刪除操作時,該事務(wù)自動獲得操作表中操作行的排它鎖。
  
  -表級鎖:當(dāng)事務(wù)獲得行鎖后,此事務(wù)也將自動獲得該行的表鎖(共享鎖),以防止其它事務(wù)進(jìn)行DDL語句影響記錄行的更新。事務(wù)也可以在進(jìn)行過程中獲得共享鎖或排它鎖,只有當(dāng)事務(wù)顯示使用LOCK TABLE語句顯示的定義一個排它鎖時,事務(wù)才會獲得表上的排它鎖,也可使用LOCK TABLE顯示的定義一個表級的共享鎖(LOCK TABLE具體用法請參考相關(guān)文檔)。
  
  -死鎖:當(dāng)兩個事務(wù)需要一組有沖突的鎖,而不能將事務(wù)繼續(xù)下去的話,就出現(xiàn)死鎖。
  
  如事務(wù)1在表A行記錄#3中有一排它鎖,并等待事務(wù)2在表A中記錄#4中排它鎖的釋放,而事務(wù)2在表A記錄行#4中有一排它鎖,并等待事務(wù); 1在表A中記錄#3中排它鎖的釋放,事務(wù)1與事務(wù)2彼此等待,因此就造成了死鎖。死鎖一般是因拙劣的事務(wù)設(shè)計(jì)而產(chǎn)生。死鎖只能使用SQL下:alter system kill session "sid,serial#";或者使用相關(guān)操作系統(tǒng)kill進(jìn)程的命令,如UNIX下kill -9 sid,或者使用其它工具殺掉死鎖進(jìn)程。
  
  +DDL鎖又可以分為:排它DDL鎖、共享DDL鎖、分析鎖
  
  -排它DDL鎖:創(chuàng)建、修改、刪除一個數(shù)據(jù)庫對象的DDL語句獲得操作對象的 排它鎖。如使用alter table語句時,為了維護(hù)數(shù)據(jù)的完成性、一致性、合法性,該事務(wù)獲得一排它DDL鎖。
  
  -共享DDL鎖:需在數(shù)據(jù)庫對象之間建立相互依靠關(guān)系的DDL語句通常需共享獲得DDL鎖。
  
  如創(chuàng)建一個包,該包中的過程與函數(shù)引用了不同的數(shù)據(jù)庫表,當(dāng)編譯此包時,該事務(wù)就獲得了引用表的共享DDL鎖。
  
  -分析鎖:ORACLE使用共享池存儲分析與優(yōu)化過的SQL語句及PL/SQL程序,使運(yùn)行相同語句的應(yīng)用速度更快。一個在共享池中緩存的對象獲得它所引用數(shù)據(jù)庫對象的分析鎖。分析鎖是一種獨(dú)特的DDL鎖類型,ORACLE使用它追蹤共享池對象及它所引用數(shù)據(jù)庫對象之間的依靠關(guān)系。當(dāng)一個事務(wù)修改或刪除了共享池持有分析鎖的數(shù)據(jù)庫對象時,ORACLE使共享池中的對象作廢,下次在引用這條SQL/PLSQL語句時,ORACLE重新分析編譯此語句。
  
  4.內(nèi)部閂鎖
  內(nèi)部閂鎖:這是ORACLE中的一種非凡鎖,用于順序訪問內(nèi)部系統(tǒng)結(jié)構(gòu)。當(dāng)事務(wù)需向緩沖區(qū)寫入信息時,為了使用此塊內(nèi)存區(qū)域,ORACLE首先必須取得這塊內(nèi)存區(qū)域的閂鎖,才能向此塊內(nèi)存寫入信息。
  
  ORACLE里鎖有以下幾種模式
  0:none
  1:null   空
  2:Row-S   行共享(RS):共享表鎖
  3:Row-X   行專用(RX):用于行的修改
  4:Share   共享鎖(S):阻止其他DML操作
  5:S/Row-X  共享行專用(SRX):阻止其他事務(wù)操作
  6:exclusive 專用(X):獨(dú)立訪問使用
  
  數(shù)字越大鎖級別越高, 影響的操作越多。
  
  一般的查詢語句如select ... from ... ;是小于2的鎖, 有時會在v$locked_object出現(xiàn)。
  
  select ... from ... for update;   是2的鎖。
  
  當(dāng)對話使用for update子串打開一個游標(biāo)時,所有返回集中的數(shù)據(jù)行都將處于行級(Row-X)獨(dú)占式鎖定,其他對象只能查詢這些數(shù)據(jù)行,不能進(jìn)行update、delete或select...for update操作。
  
  insert / update / delete ... ;    是3的鎖。

  
  沒有commit之前插入同樣的一條記錄會沒有反應(yīng),因?yàn)楹笠粋€3的鎖會一直等待上一個3的鎖, 我們必須釋放掉上一個才能繼續(xù)工作。
  
  創(chuàng)建索引的時候也會產(chǎn)生3,4級別的鎖。
  
  locked_mode為2,3,4不影響DML(insert,delete,update,select)操作,但DDL(alter,drop等)操作會提示ora-00054錯誤。
  
  有主外鍵約束時 update / delete ... ; 可能會產(chǎn)生4,5的鎖。
  
  DDL語句時是6的鎖。
  
  以DBA角色, 查看當(dāng)前數(shù)據(jù)庫里鎖的情況可以用如下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;
  
  假如有長期出現(xiàn)的一列,可能是沒有釋放的鎖。
  
  我們可以用下面SQL語句殺掉長期沒有釋放非正常的鎖:
  
  alter system kill session 'sid,serial#';
  
  假如出現(xiàn)了鎖的問題, 某個DML操作可能等待很久沒有反應(yīng)。
  
  當(dāng)你采用的是直接連接數(shù)據(jù)庫的方式,也不要用OS系統(tǒng)命令 $kill PRocess_num 或者 $kill -9 process_num來終止用戶連接,因?yàn)橐粋€用戶進(jìn)程可能產(chǎn)生一個以上的鎖, 殺OS進(jìn)程并不能徹底清除鎖的問題。
  
  在數(shù)據(jù)庫級別可用alter system kill session 'sid,serial#';殺掉不正常的鎖。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 安塞县| 清涧县| 长汀县| 古浪县| 卫辉市| 扶余县| 平安县| 昭通市| 县级市| 深州市| 泗阳县| 简阳市| 徐水县| 蓝山县| 开江县| 犍为县| 鄂托克旗| 牙克石市| 湟中县| 安陆市| 凉城县| 渝中区| 滨海县| 广宗县| 永泰县| 普洱| 大田县| 中山市| 东乌珠穆沁旗| 山东| 井陉县| 新源县| 邛崃市| 乌海市| 勃利县| 明溪县| 湘潭市| 绥中县| 淮滨县| 本溪| 南平市|