oracle的TM鎖、TX鎖知識(shí)完全普及_第1頁(yè)
oracle的TM鎖、TX鎖知識(shí)完全普及_第2頁(yè)
oracle的TM鎖、TX鎖知識(shí)完全普及_第3頁(yè)
oracle的TM鎖、TX鎖知識(shí)完全普及_第4頁(yè)
oracle的TM鎖、TX鎖知識(shí)完全普及_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、oracle的TM鎖、TX鎖知識(shí)完全普及鎖概念基礎(chǔ)數(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ù)中有兩種基本的鎖類型:排它鎖(乂。山$汽。Locks,即X鎖)和共享鎖(ShareLocks,即S鎖)。當(dāng)數(shù)據(jù)對(duì)象被加上排它鎖時(shí),其他的事務(wù)不能對(duì)它讀

2、取和修改。加了共享鎖的數(shù)據(jù)對(duì)象可以被其他事務(wù)讀取,但不能修改。數(shù)據(jù)庫(kù)利用這兩種基本的鎖類型來對(duì)數(shù)據(jù)庫(kù)的事務(wù)進(jìn)行并發(fā)控制。Oracle數(shù)據(jù)庫(kù)的鎖類型根據(jù)保護(hù)的對(duì)象不同,Oracle數(shù)據(jù)庫(kù)鎖可以分為以下幾大類:DML鎖(datalocks,數(shù)據(jù)鎖),用于保護(hù)數(shù)據(jù)的完整性;DDL鎖(dictionarylocks,字典鎖),用于保護(hù)數(shù)據(jù)庫(kù)對(duì)象的結(jié)構(gòu),如表、索引等的結(jié)構(gòu)定義;內(nèi)部鎖和閂(internallocksandlatches),保護(hù)數(shù)據(jù)庫(kù)的內(nèi)部結(jié)構(gòu)。DML鎖的目的在于保證并發(fā)情況下的數(shù)據(jù)完整性,。在Oracle數(shù)據(jù)庫(kù)中,DML鎖主要包括TM鎖和TX鎖,其中TM鎖稱為表級(jí)鎖,TX鎖稱為事務(wù)鎖或行

3、級(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等多種模式,在數(shù)據(jù)庫(kù)中用06來表示。不同的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ì)話在該條記錄上加鎖,其他

4、的會(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-60的錯(cuò)誤。這些現(xiàn)象都會(huì)對(duì)實(shí)際應(yīng)用產(chǎn)生極大的危害,如長(zhǎng)時(shí)間未響應(yīng),大量事務(wù)失敗等。悲觀封鎖和樂觀封鎖一、悲觀封鎖鎖在用戶修改之前就發(fā)揮作用:Select.forupdate(nowait)Select*fromtab1forupdate用戶發(fā)出這條命令之后,oracle將會(huì)對(duì)返回集中的數(shù)據(jù)建立行級(jí)封鎖,以防止其他用戶的修改。如果此時(shí)其他用戶對(duì)上面返回結(jié)果集的數(shù)據(jù)進(jìn)行dml或ddl操作都會(huì)返回一個(gè)錯(cuò)誤信息或發(fā)

5、生阻塞。1:對(duì)返回結(jié)果集進(jìn)行update或delete操作會(huì)發(fā)生阻塞。2:對(duì)該表進(jìn)行ddl操作將會(huì)報(bào):Ora-00054:resourcebusyandacquirewithnowaitspecified.原因分析此時(shí)Oracle已經(jīng)對(duì)返回的結(jié)果集上加了排它的行級(jí)鎖,所有其他對(duì)這些數(shù)據(jù)進(jìn)行的修改或刪除操作都必須等待這個(gè)鎖的釋放,產(chǎn)生的外在現(xiàn)象就是其他的操作將發(fā)生阻塞,這個(gè)這個(gè)操作commit或rollback.同樣這個(gè)查詢的事務(wù)將會(huì)對(duì)該表加表級(jí)鎖,不允許對(duì)該表的任何ddl操作,否則將會(huì)報(bào)出ora-00054錯(cuò)誤::resourcebusyandacquirewithnowaitspecifie

6、d.二、樂觀封鎖樂觀的認(rèn)為數(shù)據(jù)在select出來到update進(jìn)取并提交的這段時(shí)間數(shù)據(jù)不會(huì)被更改。這里面有一種潛在的危險(xiǎn)就是由于被選出的結(jié)果集并沒有被鎖定,是存在一種可能被其他用戶更改的可能。因此Oracle仍然建議是用悲觀封鎖,因?yàn)檫@樣會(huì)更安全。阻塞定義:當(dāng)一個(gè)會(huì)話保持另一個(gè)會(huì)話正在請(qǐng)求的資源上的鎖定時(shí),就會(huì)發(fā)生阻塞。被阻塞的會(huì)話將一直掛起,直到持有鎖的會(huì)話放棄鎖定的資源為止。4個(gè)常見的dml語(yǔ)句會(huì)產(chǎn)生阻塞INSERTUPDATEDELETESELECTFORUPDATEINSERTInsert發(fā)生阻塞的唯一情況就是用戶擁有一個(gè)建有主鍵約束的表。當(dāng)2個(gè)的會(huì)話同時(shí)試圖向表中插入相同的數(shù)據(jù)時(shí),其

7、中的一個(gè)會(huì)話將被阻塞,直到另外一個(gè)會(huì)話提交或會(huì)滾。一個(gè)會(huì)話提交時(shí),另一個(gè)會(huì)話將收到主鍵重復(fù)的錯(cuò)誤?;貪L時(shí),被阻塞的會(huì)話將繼續(xù)執(zhí)行。UPDATE和DELETE當(dāng)執(zhí)行Update和delete操作的數(shù)據(jù)行已經(jīng)被另外的會(huì)話鎖定時(shí),將會(huì)發(fā)生阻塞,直到另一個(gè)會(huì)話提交或會(huì)滾。Selectforupdate當(dāng)一個(gè)用戶發(fā)出select.forupdate的錯(cuò)作準(zhǔn)備對(duì)返回的結(jié)果集進(jìn)行修改時(shí),如果結(jié)果集已經(jīng)被另一個(gè)會(huì)話鎖定,就是發(fā)生阻塞。需要等另一個(gè)會(huì)話結(jié)束之后才可繼續(xù)執(zhí)行。可以通過發(fā)出selectforupdatenowait的語(yǔ)句來避免發(fā)生阻塞,如果資源已經(jīng)被另一個(gè)會(huì)話鎖定,則會(huì)返回以下錯(cuò)誤:Ora-0005

8、4:resourcebusyandacquirewithnowaitspecified.死鎖-deadlock定義:當(dāng)兩個(gè)用戶希望持有對(duì)方的資源時(shí)就會(huì)發(fā)生死鎖.即兩個(gè)用戶互相等待對(duì)方釋放資源時(shí),oracle認(rèn)定為產(chǎn)生了死鎖,在這種情況下,將以犧牲一個(gè)用戶作為代價(jià),另一個(gè)用戶繼續(xù)執(zhí)行,犧牲的用戶的事務(wù)將回滾.例子:1:用戶1對(duì)A表進(jìn)行Update,沒有提交。2:用戶2對(duì)B表進(jìn)行Update,沒有提交。此時(shí)雙反不存在資源共享的問題。3:如果用戶2此時(shí)對(duì)A表作update,則會(huì)發(fā)生阻塞,需要等到用戶一的事物結(jié)束。4:如果此時(shí)用戶1又對(duì)B表作update,則產(chǎn)生死鎖。此時(shí)Oracle會(huì)選擇其中一個(gè)用戶

9、進(jìn)行會(huì)滾,使另一個(gè)用戶繼續(xù)執(zhí)行操作。起因:Oracle的死鎖問題實(shí)際上很少見,如果發(fā)生,基本上都是不正確的程序設(shè)計(jì)造成的,經(jīng)過調(diào)整后,基本上都會(huì)避免死鎖的發(fā)生。DML鎖分類表表1Oracle的TM鎖類型鎖模式鎖描述解釋SQL操作0none1NULL空Select2SS(Row-S)行級(jí)共享鎖,其他對(duì)象只能查詢這些數(shù)據(jù)行Selectforupdate、Lockforupdate、Lockrowshare3SX(Row-X)行級(jí)排它鎖,在提交前不Insert、Update、Delete、Lockrowshare允許做DML操作4S(Share)共享鎖Createindex、Lockshare5SS

10、X(S/Row-X)共享行級(jí)排它鎖Locksharerowexclusive6X(Exclusive)排它鎖Altertable、Dropable、Dropindex、Truncatetable、Lockexclusive1.關(guān)于V$lock表和相關(guān)視圖的說明ColumnDatatypeDescriptionADDRRAW(48)AddressoflockstateobjectKADDRRAW(48)AddressoflockSIDNUMBERIdentifierforsessionholdingoracquiringthelockTYPEVARCHAR2(2)Typeofuserorsyst

11、emlockThelocksontheusertypesareobtainebyuserapplications.Anyprocessthatisblockingothersislikelytobeholdingoneoftheselocks.Theusertypelocksare:TM-DMLenqueue?TX-TransactionenqueueUL-Usersupplied我們主要關(guān)注TX和TM兩種類型的鎖-UL鎖用戶自己定義的,一般很少會(huì)定義,基本不用關(guān)注一其它均為系統(tǒng)鎖,會(huì)很快自動(dòng)釋放,不用關(guān)注ID1NUMBERLockidentifier#1(dependsontype)ID2N

12、UMBERLockidentifier#2(dependsontype)當(dāng)locktype為TM時(shí),id1為DML-lockedobject的object_id當(dāng)locktype為TX時(shí),id1為usn+slot,而id2為seq。-當(dāng)locktype為其它時(shí),不用關(guān)注LMODENUMBERLockmodeinwhichthesessionholdsthelock:0-none-null(NULL)-row-S(SS)-row-X(SX)-share(S)-S/Row-X(SSX)-exclusive(X)一大于0時(shí)表示當(dāng)前會(huì)話以某種模式占有該鎖,等于0時(shí)表示當(dāng)前會(huì)話正在等待該鎖資源,即表示該

13、會(huì)話被阻塞。一往往在發(fā)生TX鎖時(shí),伴隨著TM鎖,比如一個(gè)sid=9會(huì)話擁有一個(gè)TM鎖,一般會(huì)擁有一個(gè)或幾個(gè)TX鎖,但他們的id1和id2是不同的,請(qǐng)注意REQUESTNUMBERLockmodeinwhichtheprocessrequeststhelock:0none-null(NULL)-row-S(SS)-row-X(SX)-share(S)-S/Row-X(SSX)-exclusive(X)一大于0時(shí),表示當(dāng)前會(huì)話被阻塞,其它會(huì)話占有改鎖的模式CTIMENUMBERTimesincecurrentmodewasgrantedBLOCKNUMBERThelockisblockingano

14、therlock0,NotBlocking,/*Notblockinganyotherprocesses*/Blocking,/*Thislockblocksotheiprocesses*/Global,/*Thislockisglobal,sowecanttell*/一該鎖是否阻塞了另外一個(gè)鎖2.其它相關(guān)視圖說明視圖名描述主要字段說明v$session查詢會(huì)話的信息和鎖的信息。sid,serial#:表示會(huì)話信息。program:表示會(huì)話的應(yīng)用程序信息。row_wait_obj#:表示等待的對(duì)象,和dba_objects中的object_id相對(duì)應(yīng)。lockwait:該會(huì)話等待的鎖的地址,與

15、v$lock的kaddr對(duì)應(yīng).v$session_wait查詢等待的會(huì)話信息。sid:表示持有鎖的會(huì)話信息。Seconds_in_wait:表示等待持續(xù)的時(shí)間信息Event:表示會(huì)話等待的事件,鎖等于enqueuedba_locks對(duì)v$lock的格式化視圖。Session_id:和v$lock中的Sid對(duì)應(yīng)。Lock_type:和v$lock中的type對(duì)應(yīng)。Lock_ID1:和v$lock中的ID1對(duì)應(yīng)。Mode_held,mode_requested:和v$lock中的lmode,request相對(duì)應(yīng)。v$locked_object只包含DML的鎖信息,包括回滾段和會(huì)話信息。Xidusn,xidslot,xidsqn表示回滾段信息。和v$transactioit目關(guān)聯(lián)。Object_id:表示被鎖對(duì)象標(biāo)識(shí)。Session_id:表示持有鎖的會(huì)話信息。Locked_mode:表示會(huì)話等待的鎖模式的信息,和v$lock中的lmode一致。1.查詢數(shù)據(jù)庫(kù)中的鎖select*fromv$lock;select*fromv$lockwhereblock=1;.查詢被鎖的對(duì)象select*fromv$locked_object;.查詢阻塞查被阻塞的會(huì)話select*fromv$lockwherelmode=0andt

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論