ORACLE鎖具體分為以下幾類:
成都創(chuàng)新互聯(lián)長(zhǎng)期為上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為大寧企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì),大寧網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
1.按用戶與系統(tǒng)劃分,可以分為自動(dòng)鎖與顯示鎖
自動(dòng)鎖:當(dāng)進(jìn)行一項(xiàng)數(shù)據(jù)庫(kù)操作時(shí),缺省情況下,系統(tǒng)自動(dòng)為此數(shù)據(jù)庫(kù)操作獲得所有有必要的
顯示鎖:某些情況下,需要用戶顯示的鎖定數(shù)據(jù)庫(kù)操作要用到的數(shù)據(jù),才能使數(shù)據(jù)庫(kù)操作執(zhí)行得更好,顯示鎖是用戶為數(shù)據(jù)庫(kù)對(duì)象設(shè)定的。
2.按鎖級(jí)別劃分,可分為共享鎖與排它鎖
共享鎖:共享鎖使一個(gè)事務(wù)對(duì)特定數(shù)據(jù)庫(kù)資源進(jìn)行共享訪問(wèn)——另一事務(wù)也可對(duì)此資源進(jìn)行訪問(wèn)或獲得相同共享鎖。共享鎖為事務(wù)提供高并發(fā)性,但如拙劣的事務(wù)設(shè)計(jì)+共享鎖容易造成死鎖或數(shù)據(jù)更新丟失。
排它鎖:事務(wù)設(shè)置排它鎖后,該事務(wù)單獨(dú)獲得此資源,另一事務(wù)不能在此事務(wù)提交之前獲得相同對(duì)象的共享鎖或排它鎖。
3.按操作劃分,可分為DML鎖、DDL鎖
+DML鎖又可以分為,行鎖、表鎖、死鎖
-行鎖:當(dāng)事務(wù)執(zhí)行數(shù)據(jù)庫(kù)插入、更新、刪除操作時(shí),該事務(wù)自動(dòng)獲得操作 表中操作行的排它鎖。
-表級(jí)鎖:當(dāng)事務(wù)獲得行鎖后,此事務(wù)也將自動(dòng)獲得該行的表鎖(共享鎖),以防止其它事務(wù)進(jìn)行DDL語(yǔ)句影響記錄行的更新。事務(wù)也可以在進(jìn)行 過(guò)程中獲得共享鎖或排它鎖,只有當(dāng)事務(wù)顯示使用LOCK TABLE語(yǔ) 句顯示的定義一個(gè)排它鎖時(shí),事務(wù)才會(huì)獲得表上的排它鎖,也可使用
LOCK TABLE顯示的定義一個(gè)表級(jí)的共享鎖(LOCK TABLE具體用法請(qǐng)參 考相關(guān)文檔)。
-死鎖:當(dāng)兩個(gè)事務(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)建、修改、刪除一個(gè)數(shù)據(jù)庫(kù)對(duì)象的DDL語(yǔ)句獲得操作對(duì)象的 排它鎖。
如使用alter table語(yǔ)句時(shí),為了維護(hù)數(shù)據(jù)的完成性、一致性、
合法性,該事務(wù)獲得一排它DDL鎖。
-共享DDL鎖:需在數(shù)據(jù)庫(kù)對(duì)象之間建立相互依賴關(guān)系的DDL語(yǔ)句通常需共享
獲得DDL鎖。
如創(chuàng)建一個(gè)包,該包中的過(guò)程與函數(shù)引用了不同的數(shù)據(jù)庫(kù)表,
當(dāng)編譯此包時(shí),該事務(wù)就獲得了引用表的共享DDL鎖。
-分析鎖:ORACLE使用共享池存儲(chǔ)分析與優(yōu)化過(guò)的SQL語(yǔ)句及PL/SQL程序,使
運(yùn)行相同語(yǔ)句的應(yīng)用速度更快。一個(gè)在共享池中緩存的對(duì)象獲得
它所引用數(shù)據(jù)庫(kù)對(duì)象的分析鎖。分析鎖是一種獨(dú)特的DDL鎖類型,
ORACLE使用它追蹤共享池對(duì)象及它所引用數(shù)據(jù)庫(kù)對(duì)象之間的依賴 關(guān)系。當(dāng)一個(gè)事務(wù)修改或刪除了共享池持有分析鎖的數(shù)據(jù)庫(kù)對(duì)象
時(shí),ORACLE使共享池中的對(duì)象作廢,下次在引用這條SQL/PLSQL語(yǔ) 句時(shí),ORACLE重新分析編譯此語(yǔ)句。
4.內(nèi)部閂鎖
內(nèi)部閂鎖:這是ORACLE中的一種特殊鎖,用于順序訪問(wèn)內(nèi)部系統(tǒng)結(jié)構(gòu)。
當(dāng)事務(wù)需向緩沖區(qū)寫入信息時(shí),為了使用此塊內(nèi)存區(qū)域, ORACLE首先必須取得這塊內(nèi)存區(qū)域的閂鎖,才能向此塊內(nèi)存寫入
信息。
1.共享鎖(S鎖):如果事務(wù)T對(duì)數(shù)據(jù)A加上共享鎖后,則其他事務(wù)只能對(duì)A再加共享鎖,不能加排他鎖。獲準(zhǔn)共享鎖的事務(wù)只能讀數(shù)據(jù),不能修改數(shù)據(jù)。
排他鎖(X鎖):如果事務(wù)T對(duì)數(shù)據(jù)A加上排他鎖后,則其他事務(wù)不能再對(duì)A加任任何類型的封鎖。獲準(zhǔn)排他鎖的事務(wù)既能讀數(shù)據(jù),又能修改數(shù)據(jù)。
2.共享鎖下其它用戶可以并發(fā)讀取,查詢數(shù)據(jù)。但不能修改,增加,刪除數(shù)據(jù)。資源共享.
1、首先只有表級(jí)的共享鎖沒(méi)有行級(jí)共享鎖
2、加了共享鎖的數(shù)據(jù)對(duì)象可以被其他事務(wù)讀取,但不能修改。
3、多個(gè)用戶可以同時(shí)對(duì)同一個(gè)表加共享鎖。
4、行級(jí)鎖只能由一個(gè)用戶加,加了行級(jí)鎖的數(shù)據(jù)對(duì)象可以被其他事務(wù)讀取,但不能修改。
加共享鎖方法:
locktable表名insharemode
※這個(gè)語(yǔ)句可以有多個(gè)用戶執(zhí)行
加行級(jí)鎖方法
select*from表名where條件forupdate
※這個(gè)只能有一個(gè)用戶執(zhí)行
---
以上,希望對(duì)你有所幫助。
此文章主要是對(duì)Oracle數(shù)據(jù)庫(kù)鎖機(jī)制的詳細(xì)研究 首先我們要介紹的是Oracle數(shù)據(jù)庫(kù)鎖的類型 同時(shí)也闡述 在實(shí)際應(yīng)用中我們經(jīng)常會(huì)遇到的與鎖相關(guān)的異常情況 特別對(duì)經(jīng)常遇到的由于等待鎖而使事務(wù)被掛起的問(wèn)題進(jìn)行了定位及解決 并對(duì)死鎖這一比較嚴(yán)重的現(xiàn)象 提出了相應(yīng)的解決方法和具體的分析過(guò)程
數(shù)據(jù)庫(kù)是一個(gè)多用戶使用的共享資源 當(dāng)多個(gè)用戶并發(fā)地存取數(shù)據(jù)時(shí) 在數(shù)據(jù)庫(kù)中就會(huì)產(chǎn)生多個(gè)事務(wù)同時(shí)存取同一數(shù)據(jù)的情況 若對(duì)并發(fā)操作不加控制就可能會(huì)讀取和存儲(chǔ)不正確的數(shù)據(jù) 破壞數(shù)據(jù)庫(kù)的一致性
加鎖是實(shí)現(xiàn)數(shù)據(jù)庫(kù)并發(fā)控制的一個(gè)非常重要的技術(shù) 當(dāng)事務(wù)在對(duì)某個(gè)數(shù)據(jù)對(duì)象進(jìn)行操作前 先向系統(tǒng)發(fā)出請(qǐng)求 對(duì)其加鎖 加鎖后事務(wù)就對(duì)該數(shù)據(jù)對(duì)象有了一定的控制 在該事務(wù)釋放鎖之前 其他的事務(wù)不能對(duì)此數(shù)據(jù)對(duì)象進(jìn)行更新操作
在數(shù)據(jù)庫(kù)中有兩種基本的鎖類型 排它鎖(Exclusive Locks 即X鎖)和共享鎖(Share Locks 即S鎖) 當(dāng)數(shù)據(jù)對(duì)象被加上排它鎖時(shí) 其他的事務(wù)不能對(duì)它讀取和修改 加了共享鎖的數(shù)據(jù)對(duì)象可以被其他事務(wù)讀取 但不能修改 數(shù)據(jù)庫(kù)利用這兩種基本的鎖類型來(lái)對(duì)Oracle數(shù)據(jù)庫(kù)的事務(wù)進(jìn)行并發(fā)控制
在實(shí)際應(yīng)用中經(jīng)常會(huì)遇到的與鎖相關(guān)的異常情況 如由于等待鎖事務(wù)被掛起 死鎖等現(xiàn)象 如果不能及時(shí)地解決 將嚴(yán)重影響應(yīng)用的正常執(zhí)行 而目前對(duì)于該類問(wèn)題的解決缺乏系統(tǒng)化研究和指導(dǎo) 本文在總結(jié)實(shí)際經(jīng)驗(yàn)的基礎(chǔ)上 提出了相應(yīng)的解決方法和具體的分析過(guò)程
Oracle數(shù)據(jù)庫(kù)的鎖類型
根據(jù)保護(hù)的對(duì)象不同 Oracle數(shù)據(jù)庫(kù)鎖可以分為以下幾大類 DML鎖(data locks 數(shù)據(jù)鎖) 用于保護(hù)數(shù)據(jù)的完整性 DDL鎖(dictionary locks 字典鎖) 用于保護(hù)數(shù)據(jù)庫(kù)對(duì)象的結(jié)構(gòu) 如表 索引等的結(jié)構(gòu)定義 內(nèi)部鎖和閂(internal locks and latches) 保護(hù)數(shù)據(jù)庫(kù)的內(nèi)部結(jié)構(gòu)
DML鎖的目的在于保證并 *** 況下的數(shù)據(jù)完整性 本文主要討論DML鎖 在Oracle數(shù)據(jù)庫(kù)中 DML鎖主要包括TM鎖和TX鎖 其中TM鎖稱為表級(jí)鎖 TX鎖稱為事務(wù)鎖或行級(jí)鎖
當(dāng)Oracle執(zhí)行DML語(yǔ)句時(shí) 系統(tǒng)自動(dòng)在所要操作的表上申請(qǐng)TM類型的鎖 當(dāng)TM鎖獲得后 系統(tǒng)再自動(dòng)申請(qǐng)TX類型的鎖 并將實(shí)際鎖定的數(shù)據(jù)行的鎖標(biāo)志位進(jìn)行置位 這樣在事務(wù)加鎖前檢查TX鎖相容性時(shí)就不用再逐行檢查鎖標(biāo)志 而只需檢查TM鎖模式的相容性即可 大大提高了系統(tǒng)的效率
TM鎖包括了SS SX S X等多種模式 在Oracle數(shù)據(jù)庫(kù)中用 - 來(lái)表示 不同的SQL操作產(chǎn)生不同類型的TM鎖 如表 所示
在數(shù)據(jù)行上只有X鎖(排他鎖) 在 Oracle數(shù)據(jù)庫(kù)中 當(dāng)一個(gè)事務(wù)首次發(fā)起一個(gè)DML語(yǔ)句時(shí)就獲得一個(gè)TX鎖 該鎖保持到事務(wù)被提交或回滾 當(dāng)兩個(gè)或多個(gè)會(huì)話在表的同一條記錄上執(zhí)行DML語(yǔ)句時(shí) 第一個(gè)會(huì)話在該條記錄上加鎖 其他的會(huì)話處于等待狀態(tài) 當(dāng)?shù)谝粋€(gè)會(huì)話提交后 TX鎖被釋放 其他會(huì)話才可以加鎖
當(dāng)Oracle數(shù)據(jù)庫(kù)發(fā)生TX鎖等待時(shí) 如果不及時(shí)處理常常會(huì)引起Oracle數(shù)據(jù)庫(kù)掛起 或?qū)е滤梨i的發(fā)生 產(chǎn)生ORA 的錯(cuò)誤 這些現(xiàn)象都會(huì)對(duì)實(shí)際應(yīng)用產(chǎn)生極大的危害 如長(zhǎng)時(shí)間未響應(yīng) 大量事務(wù)失敗等
TX鎖等待的分析
在介紹了有關(guān)地Oracle數(shù)據(jù)庫(kù)鎖的種類后 下面討論如何有效地監(jiān)控和解決鎖等待現(xiàn)象 及在產(chǎn)生死鎖時(shí)如何定位死鎖的原因
監(jiān)控鎖的相關(guān)視圖 數(shù)據(jù)字典是Oracle數(shù)據(jù)庫(kù)的重要組成部分 用戶可以通過(guò)查詢數(shù)據(jù)字典視圖來(lái)獲得數(shù)據(jù)庫(kù)的信息 和鎖相關(guān)的數(shù)據(jù)字典視圖如表 所示
TX鎖等待的監(jiān)控和解決在日常工作中 如果發(fā)現(xiàn)在執(zhí)行某條SQL時(shí)數(shù)據(jù)庫(kù)長(zhǎng)時(shí)間沒(méi)有響應(yīng) 很可能是產(chǎn)生了TX鎖等待的現(xiàn)象 為解決這個(gè)問(wèn)題 首先應(yīng)該找出持鎖的事務(wù) 然后再進(jìn)行相關(guān)的處理 如提交事務(wù)或強(qiáng)行中斷事務(wù)
死鎖的監(jiān)控和解決在數(shù)據(jù)庫(kù)中 當(dāng)兩個(gè)或多個(gè)會(huì)話請(qǐng)求同一個(gè)資源時(shí)會(huì)產(chǎn)生死鎖的現(xiàn)象 死鎖的常見(jiàn)類型是行級(jí)鎖死鎖和頁(yè)級(jí)鎖死鎖 Oracle數(shù)據(jù)庫(kù)中一般使用行級(jí)鎖 下面主要討論行級(jí)鎖的死鎖現(xiàn)象
當(dāng)Oracle檢測(cè)到死鎖產(chǎn)生時(shí) 中斷并回滾死鎖相關(guān)語(yǔ)句的執(zhí)行 報(bào)ORA 的錯(cuò)誤并記錄在Oracle數(shù)據(jù)庫(kù)的日志文件alertSID log中 同時(shí)在user_dump_dest下產(chǎn)生了一個(gè)跟蹤文件 詳細(xì)描述死鎖的相關(guān)信息
在日常工作中 如果發(fā)現(xiàn)在日志文件中記錄了ora 的錯(cuò)誤信息 則表明產(chǎn)生了死鎖 這時(shí)需要找到對(duì)應(yīng)的跟蹤文件 根據(jù)跟蹤文件的信息定位產(chǎn)生的原因
如果查詢結(jié)果表明 死鎖是由于bitmap索引引起的 將IND_T_PRODUCT_HIS_STATE索引改為normal索引后 即可解決死鎖的問(wèn)題
表 Oracle的TM鎖類型
鎖模式 鎖描述 解釋 SQL操作
none
NULL 空 Select
SS(Row S) 行級(jí)共享鎖 其他對(duì)象只能查詢這些數(shù)據(jù)行 Select for update Lock for update Lock row share
SX(Row X) 行級(jí)排它鎖 在提交前不允許做DML操作 Insert Update Delete Lock row share
S(Share) 共享鎖 Create index Lock share
SSX(S/Row X) 共享行級(jí)排它鎖 Lock share row exclusive
lishixinzhi/Article/program/Oracle/201311/18509