




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Oracle是一個(gè)多用戶并發(fā)處理系統(tǒng),在同一個(gè)時(shí)間點(diǎn)上,可能會有多個(gè)1、這些用戶之間的操作不會互相破壞,比如兩個(gè)用戶同時(shí)在相同的物2、在滿足串行化的前提下,如何將并發(fā)性提升型的鎖控制對數(shù)據(jù)的并發(fā),以防止用戶之間出現(xiàn)破壞性的交互操作。個(gè)進(jìn)程同時(shí)資源,會造成資源的破壞,那么就需要給這種資源上一個(gè)鎖,如果這種資源很簡單,例如內(nèi)存的分配和,那么就使用latch,如果這種資源相對復(fù)雜,有一定的邏輯判斷,那么就需要使用lock。閂鎖Oracle使用閂鎖來實(shí)現(xiàn)內(nèi)存的分配和例某個(gè)用戶進(jìn)程A發(fā)出一條update語句,要去58號數(shù)據(jù)塊里的某條出insert語句,要將某個(gè)新的記錄到58號數(shù)據(jù)塊中,如果沒有一定的保護(hù)機(jī)制,A正要寫入的空間可能被B搶先寫入,B要寫入的空間可能被A搶先寫入,不管哪個(gè)用戶先搶先寫入,造成的結(jié)果就是,58號數(shù)據(jù)塊的數(shù)據(jù)都了在寫入過程中,一直持有l(wèi)atch,寫完以后,latch。B嘗試latch,發(fā)現(xiàn)latchA持有,B進(jìn)入等待狀態(tài),直Alatch,Blatch以后,才能在58號數(shù)據(jù)塊中寫入數(shù)據(jù)。凡是涉及內(nèi)存的讀和寫,就需要通過latch來實(shí)現(xiàn),一次只能有一Oracle在實(shí)例管理中,不管是buffercache、sharedpoollogbuffer,都引入了各種各樣的latch。可以這樣來理解latch,通過某個(gè)變量值的變化來實(shí)現(xiàn),變0則說明latch沒有被其它進(jìn)程獲取,變量值為非0則說明latch被其他進(jìn)程獲取Latch分為兩種類這種類latch都是test-and-set的方式獲得的,也就是說,如果當(dāng)前進(jìn)程不能獲latch的時(shí)候CPU旋轉(zhuǎn),而不放CPU,這就占用著CPU。latch,為什么還要占用CPUlatch本身是但是沒有獲得latchCPU,那么需要進(jìn)行上下文的切換,下次再次嘗試獲得latch時(shí),又要進(jìn)行上下文切換,可能消耗的時(shí)間,因此,會通過執(zhí)行一段空代碼繞著CPU轉(zhuǎn),然后再次嘗試獲得latch。如果仍然不能夠獲latch,繼續(xù)旋轉(zhuǎn),當(dāng)反復(fù)旋轉(zhuǎn)CPU并嘗試獲得latch的次數(shù)超過某個(gè)上限時(shí)(該上限由隱藏參數(shù)控制,這時(shí)進(jìn)程會CPUsleep狀態(tài),進(jìn)程一旦進(jìn)入sleep狀態(tài),就會拋出一個(gè)等待事件,并記錄v$session_wait里,進(jìn)程正在等latch的信息會出現(xiàn)一個(gè)進(jìn)程會睡眠0.01秒,然后醒來,并再次嘗試獲得latch,如果旋轉(zhuǎn)CPU的次數(shù)達(dá)到上限值,仍然不能獲得latch,則再次進(jìn)入睡眠,這時(shí)會睡眠兩倍的時(shí)間,以此類推,直到達(dá)到睡眠的最大值:0.2秒。上面的情況是數(shù)據(jù)庫服務(wù)器具有CPU的情況,如果只有CPU,就不存在旋轉(zhuǎn)CPU的情況,一旦獲得不了latch,就進(jìn)入睡眠。2、不等待(no-這種類型的latch較少,對于這種類型latch來說,都會有很多個(gè)可用的latch。當(dāng)一個(gè)進(jìn)程請求其中的一個(gè)latch時(shí)no-wait模式開始請求,如果有當(dāng)所有的latch都不能獲得的時(shí)候,才會進(jìn)入等待。源很緊張,利用率總是在90%以上,甚至總是在100%,主要原因如下時(shí)隨意性過大,比如大小寫混用、則OracleSQL語句都要進(jìn)行解析,也就是非常頻繁地讀寫sharedpool里的內(nèi)存塊,從而導(dǎo)致與解析SQL相關(guān)的latch爭用。sqlSQL語句寫的比較低一旦發(fā)生latch資源爭用,就會導(dǎo)致CPU繁假設(shè)進(jìn)程A執(zhí)行一條SQL語句需要10000個(gè)數(shù)據(jù)塊,那么該進(jìn)掃描數(shù)據(jù)塊的過程中,一直持有l(wèi)atch,而另一個(gè)進(jìn)程B也要執(zhí)行SQL得latch,直到睡眠才CPU,接下來C進(jìn)程也要執(zhí)行SQL,同樣的,由于A持有了latchC無法獲得,于是旋CPU,再去獲latch,直到進(jìn)入睡眠才CPU,如果類似進(jìn)程很多的話,CPU總是在旋轉(zhuǎn),也就是在做空的循環(huán),而無法做其他的事情,因此體現(xiàn)出CPU使用率過鎖定Lock用來控制多個(gè)用戶對表里相同數(shù)據(jù)如果沒有使用鎖定來管理事務(wù),則在9:04的時(shí)候,用戶A檢索id=1列值時(shí),顯示為20,用戶A的修改被B覆蓋使用鎖定以后的情況在鎖定中,存在下面的兩種基1、排他鎖(X鎖,一旦用戶對某個(gè)資源添加了排他鎖,則其他用戶都不能再對該資源添加任何類型的鎖,直到該用戶了資源上的X鎖在該資源上添加X鎖,只能添加S鎖,直到該用戶了S鎖為止DML事務(wù)鎖定機(jī)制行級鎖(TX鎖updateemployeesetlast_name=‘xkj’where1、OracleSQL語句進(jìn)行解析,找exployee_id100的記錄所在的列上被更新前的舊值放入該undoSCN號、所使用的undo數(shù)據(jù)塊的地址,以及未提交的標(biāo)記等信息358號數(shù)據(jù)塊中,找到被更新的數(shù)據(jù)行,在數(shù)據(jù)行頭部設(shè)置一個(gè)鎖定標(biāo)記,并在頭部記錄當(dāng)前使用的ITL槽號,做完這些工作X鎖如果這時(shí),另一個(gè)用B也對exployee_id100的記錄進(jìn)行修改,則其過上面描述一樣B在對數(shù)據(jù)行的頭部設(shè)置鎖定標(biāo)記的時(shí)候,發(fā)現(xiàn)該數(shù)據(jù)行頭部已經(jīng)有一個(gè)鎖定標(biāo)記了,說明該記錄已經(jīng)添加X鎖,于是用戶B必須等待,等待X鎖被。鎖定一條記錄,并不影響其他用戶對該記錄的,例如果用戶發(fā)出一SQLexployee_id100的記錄信這時(shí)服了,但是還沒有提交。于是根據(jù)數(shù)據(jù)行頭部ITL槽的號碼,在數(shù)據(jù)塊頭部ITL槽,并根據(jù)其中記錄undo數(shù)據(jù)塊的地址,找到undo讀一致性)塊,根據(jù)CR塊的內(nèi)容,將用戶所需要的信息進(jìn)行返回。表級A已經(jīng)發(fā)出了更新exployee_id100的記錄的SQL語句,當(dāng)A還沒有提交之前,另外一個(gè)用戶D發(fā)出下面的語句droptable由于A還沒有提交所做的事務(wù),該事務(wù)還沒有結(jié)束,其他用戶不能刪除該表,否則A所發(fā)出的事務(wù)就無法正常結(jié)束,為了用戶D的刪除操作,能夠想到的最直觀的方法是顯然這樣存在很大的性能問表級鎖共5種模1、行級排他鎖(Rowexclusive)RX當(dāng)進(jìn)行DML時(shí),會自動在被更新的表上添加RX鎖,可以執(zhí)允許其他事務(wù)通過DML語句修改相同表里的其他數(shù)據(jù)行允許使用lock命令對表添加RX鎖定不允許其他事務(wù)對表添加XSYS@orcl>createtabletestx(idnumber);SYS@orcl>insertintotestxvalues(1);在Sess1中數(shù)據(jù),不提交,再打開Sess2,添加XSYS@orcl>locktabletestxinexclusive不能添加X中可以添加X鎖。SYS@orcl>locktabletestxinexclusivemode;Table(s)Locked.成功添加XSYS@orcl>createtabletest1(idnumber);SYS@orcl>insertintotest1values(1);務(wù)使用lock添加一個(gè)行級排他鎖SYS@orcl>locktabletest1inrowexclusivemode;Table(s)Locked.在Sess1中無法XSYS@orcl>locktabletest1inexclusive不成在sess2中rollbacksess1可以添加X鎖,Sess2中無XSYS@orcl>SYS@orcl>locktabletest1inexclusivemode;Sess1成功SYS@orcl>locktabletest1inexclusiveSess2不成行級共享鎖(rowsharedRS鎖這些命令。查詢完成以后,發(fā)出rollback命令表上添加RS鎖以后,不允許其他事務(wù)對相同的表添X鎖,但是允許SYS@orcl>createtabletest2(idnumber,namevarchar2(10));SYS@orcl>insertintotest2values(1,'aa');SYS@orcl>insertintotest2values(2,'bb');SYS@orcl>commit;SYS@orcl>select*fromtest2whereid=1forupdate;Sess2,不允許對鎖定的數(shù)據(jù)進(jìn)行修改SYS@orcl>deletefromtest2;SYS@orcl>deletefromtest2whereid=2;SYS@orcl>commit;在對表進(jìn)行DML的時(shí)候,已經(jīng)在表上添加了行級排他鎖,因此在有行級共SYS@orcl>locktabletest2inrowexclusivemode;SYS@orcl>locktabletest2inexclusive不成Sess2,rollback后,sess1可以添加排他鎖SYS@orcl>locktabletest2inexclusivemode;共享鎖(shared)SSYS@orcl>createtabletest3(idnumber);SYS@orcl>insertintotest3values(1);SYS@orcl>insertintotest3values(2);SYS@orcl>commit;SYS@orcl>locktabletest3insharemode;Sess2,不允許進(jìn)行DML操作SYS@orcl>insertintotest3values(5);Sess1,rollback后,sess2可以數(shù)據(jù)Sess2,允許進(jìn)行RSSYS@orcl>locktabletest3inrowshare注:共享鎖和排他鎖的區(qū)別是可以允許排他鎖(exclusive)X其他事務(wù)不能對表進(jìn)行任何的DMLDDL操作,只能進(jìn)行查SYS@orcl>locktabletest3inexclusive共享行級排他鎖(sharedrowexclusive)SRX不能對相同的表進(jìn)行DML操作,也不能添加共鎖之間的兼容性,有了這個(gè)鎖,能不能有另外一 exclusive][exclusive]mode;可以通過DML進(jìn)行自動的加鎖,也可以使用LOCK手工共享鎖(ShareTableLockS加鎖語ockTableTableNameInShare表。一個(gè)有效的共享鎖明確地SelectForupdate形式鎖定行,或執(zhí)行LOCKTABLETableNameINSHAREROWEXCLUSIVEMODE;LOCKTABLETableNameINROWEXCLUSIVEMODE;排它鎖(ExclusiveTableLockX加鎖語ockTableTableNameInExclusive定義排它鎖的語法LOCKTABLETableNameINEXCLUSIVE行級鎖(RowShareTableLock,RS一個(gè)行級鎖(有時(shí)SubshareTableLock,簡SS,子共享鎖)需要該事務(wù)在被鎖定行的表update的形式加鎖。當(dāng)有下面語句被執(zhí)行的時(shí)候SELECT...FROMTableName...FORUPDATEOF...;LOCKTABLETableNameINROWSHAREMODE;行級鎖(RowShareTableLock)在鎖類型中是限制最少的,也是在表的并允許的操作:行級共享鎖由一個(gè)事務(wù)控制,允許其它事務(wù)查詢、、更的操作:擁有行級鎖的事務(wù)不允許其它事務(wù)執(zhí)行排它鎖,即LockTableTableNameInExclusive行級排它鎖(RowExclusiveTableLock,RXINSERTINTOTableName...;UPDATETableName...;DELETEFROMTableName...;LOCKTABLETableNameINROWEXCLUSIVE行級排它鎖比行級鎖稍微多一些限制LOCKTABLEtableINSHARELOCKTABLEtableINSHAREEXCLUSIVEMODE;LOCKTABLEtableINEXCLUSIVEMODE共享行級排它鎖(ShareRowExclusiveTableLock,SRX共享行級排它鎖有時(shí)也稱共享子排它鎖(ShareSubexclusiveTableLock,SSX,它比共享鎖有限制。定義共享行級排它鎖的語法為:LockTableTableNameInShareRowExclusive鎖事務(wù)允許其它事務(wù)在被鎖定的表上執(zhí)行查詢或使用SelectFromTableNameForupdate…來準(zhǔn)確在鎖定行而不能更新行。LOCKTABLETableNameINSHAREMODE;LOCKTABLETableNameINSHAREROWEXCLUSIVEMODE;LOCKTABLETableNameINROWEXCLUSIVEMODE;LOCKTABLETableNameINEXCLUSIVE據(jù)庫掛起,或?qū)е滤梨i的發(fā)生,產(chǎn)生ORA-60的錯(cuò)誤。解決DML事務(wù)鎖定的兼容的鎖定,就會發(fā)生鎖定的現(xiàn)象。鎖定相關(guān)視其中比較重要的字段包括XIDUSN表示當(dāng)前事務(wù)使用的回滾段的、做槽號、XIDSQN說明序列號、STATUS說明該事務(wù)是否為活動的。記錄了當(dāng)session已經(jīng)獲得的鎖定以及正在請求的鎖定的信息。其中比較TX和TM、LMODE說明已經(jīng)獲得的鎖定的模式,以數(shù)字編碼表示、REQUEST說明正在請求的鎖定的模式,以數(shù)字編碼表示。BLOCK說明是否了其他用戶獲得鎖定,大于0說明是,等于0說明否。該視圖中包含的字段以及字段含義v$lock中的字段一模一樣。只不過該錄按照申請鎖定的時(shí)間先后順序排列,先申請鎖定的session排面,排面的session將會先獲得鎖定。記錄了當(dāng)前已經(jīng)被鎖定的對象的信息。其中比較重要的字段包括XIDUSN表示當(dāng)前事務(wù)使用的回滾段的、XIDSLOT說明該事務(wù)在回滾段頭部的事務(wù)表中對應(yīng)的記錄、XIDSQN說明序列號、OBJECT_ID說明當(dāng)前被鎖定的對象的ID號,可以IDdba_objects里查找被鎖定的對象名稱、LOCKED_MODE說明鎖定模式的數(shù)字編碼。記錄了當(dāng)前session的相關(guān)信息。其中比較重要的字段包SID表示sessionSYS@orcl>createtabletest5(idnumber,namevarchar(10),salarynumber);SYS@orcl>insertintotest5values(1,'a',12000);SYS@orcl>insertintotest5values(1,'a',3000);SYS@orcl>insertintotest5values(1,'a',20000);SYS@orcl>insertintotest5values(2,'b',11000);SYS@orcl>commit;SYS@orcl>updatetest5setname='wl'whereid=1;SYS@orcl>selectsidfromv$mystatwhererownum=1;Sess1的sessionIDSYS@orcl>selectxidusn,xidslot,xidsqn,statusfromv$transaction; XIDSQNSTATUS 該會話使用了5號回該會話在回滾段事務(wù)表中的槽號是事務(wù)是活動的,也就是沒有提SYS@orcl>selectsid,type,id1,id2,decode(lmode,0,'none',1,'null',2,'rowsharee',3,'rowexclusive',4,'share',5,'sharerowexclusive',6,'exclusive') exclusive',4,'share',5,'sharerowexclusive',6,'exclusive')request_mode,blockfromv$lockwheresid=31;SIDTYID1ID2LOCK_MODEREQUEST_MODE row ID1:對于TM鎖來說,被鎖定對象的IDSYS@orcl>selectobject_namefromdba_objectswhereobject_id=88622;被鎖定對象是另外啟動一個(gè)sessionSYS@orcl>selectsidfromv$mystatwhererownum=1;SessionIDSYS@orcl>updatetest5setname='ww'where這個(gè)會話被鎖定了回到session1,查看一下會話的鎖的情況SYS@orcl>selectsid,type,id1,id2,decode(lmode,0,'none',1,'null',2,'rowsharee',3,'rowexclusive',4,'share',5,'sharerowexclusive',6,'exclusive') exclusive',4,'share',5,'sharerowexclusive',6,'exclusive')request_mode,blockfromv$lockwheresidin(31,34);SIDTYID1ID2LOCK_MODEREQUEST_MODE000000row00row0134請求的鎖是行級排他鎖,但是該記錄31會話鎖定,因此鎖定模式為NONE34在TM上獲得了行級排他鎖,因?yàn)檫@個(gè)鎖和已有的鎖并不,31的鎖再次啟動一個(gè)sessionSYS@orcl>selectsidfromv$mystatwhererownum=1;SYS@orcl>updatetest5setname='ww'where事務(wù)也被鎖定回到session1執(zhí)行這個(gè)命SYS@orcl>selectsid,type,decode(request,0,'none',1,'null',2,'rowshare',3,'rowexclusive',4,'share',5,'sharerowexclusive',6,'exclusive')request_modefromv$enqueue_lockwheresidin(31,34,56); TY TX TX AE AE AE exclusive',4,'share',5,'sharerowexclusive',6,'exclusive')lock_mode,b.ctimeas request_mode,c.ctimetime_waitedfromv$lockb,v$enqueue_lockc,v$sessionawherea.sid=b.sidandb.id1=c.id1(+)andb.id2=c.id2(+)andc.type(+)='TX'andb.type='TX'andBLOCKER_SIDSERIAL#BLOCKER_USERNAMETYLOCK_MODTIME_HELDWAITER_SIDREQUEST_MODE切換sess1會話,在31會話中,提交事務(wù)。再次運(yùn)行查SYS@orcl> exclusive',4,'share',5,'sharerowexclusive',6,'exclusive')lock_mode,b.ctimeas request_mode,c.ctimetime_waitedfromv$lockb,v$enqueue_lockc,v$sessionawherea.sid=b.sidandb.id1=c.id1(+)andb.id2=c.id2(+)andc.type(+)='TX'andb.type='TX'andBLOCKER_SIDSERIAL#BLOCKER_USERNAMETYLOCK_MODTIME_HELDWAITER_SIDREQUEST_MODE SYS@orcl>altersystemkillsession'34,2657';再次查詢,發(fā)現(xiàn)已經(jīng)沒有了鎖SYS@orcl> exclusive',4,'share',5,'sharerowexclusive',6,'exclusive')lock_mode,b.ctimeas request_mode,c.ctimetime_waitedfromv$lockb,v$enqueue_lockc,v$sessionawherea.sid=b.sidandb.id1=c.id1(+)andb.id2=c.id2(+)andc.type(+)='TX'andb.type='TX'andb.block=1;norows2/*selectsid,id1,id2,lmode,request,typefromv$lockwhereid1in(selectid1fromv$lockwherelmode=0)orderbyid1,request;--TMTXselectsid,type,id1,id2, reqtime,blockfromv$lockwheretypein('TM','TX');--TMTX decode(request,0,'NONE',1,'NULL',2,'RS',3,'RX',4,'S',5,'RSX',6,'X')request, ctime,blockfromv$lockwheretypein('TM','TX');3IDselectl.os_user_name,s.username, o.object_name,o.object_type,s.logon_timefromv$locked_objectl,v$sessions,dba_objectsowherel.session_id=orderbys.logon_time;或selectl.oracle_usernameo_name,l.session_idsid,o.object_name,o.object_type,l.xidusn,l.xidslot,l.xidsqnfromv$locked_objectl,all_objectsowherel.object_id=o.object_idorderby或SELECTp.spid,a.serial#,c.object_name,b.session_id,b.oracle_username,b.os_user_nameFROMv$processp,v$sessiona,v$locked_objectb,all_objectscWHEREp.addr=a.paddrANDcess=cessANDc.object_id=b.object_id;如何查找引起鎖的S
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 皮革制品的產(chǎn)品差異化競爭考核試卷
- 住宅房屋裝修設(shè)計(jì)與應(yīng)用考核試卷
- 礦產(chǎn)勘查中的礦產(chǎn)資源綜合利用與節(jié)能減排考核試卷
- 電子制造中的高精度切割技術(shù)考核試卷
- 燈具的智能控制系統(tǒng)與家居集成考核試卷
- 淀粉在工業(yè)用粘合劑的增強(qiáng)應(yīng)用考核試卷
- 健身器材行業(yè)項(xiàng)目管理與質(zhì)量控制考核試卷
- 2025合作經(jīng)營合同協(xié)議書
- 20254月生物降解耗材采購環(huán)保降解周期檢測協(xié)議
- 居民用電安全知識培訓(xùn)
- 山東省臨沂市蘭山區(qū)2022~2023+學(xué)年八年級下學(xué)期物理期末試卷
- 武漢市華中師范大學(xué)實(shí)驗(yàn)技術(shù)人員招聘考試真題2022
- 地鐵16號線風(fēng)閥設(shè)備維修保養(yǎng)手冊
- 橋牌比賽形式簡介
- 中國施工企業(yè)管理協(xié)會科學(xué)技術(shù)獎(jiǎng)技術(shù)創(chuàng)新成果申報(bào)書
- 肩手綜合征的現(xiàn)代康復(fù)治療演示
- 六角螺母加工實(shí)習(xí)指導(dǎo)書
- 小學(xué)生詩詞大賽100題(含答案)
- 電機(jī)驅(qū)動系統(tǒng)
- JJF(石化)028-2019漆膜干燥時(shí)間試驗(yàn)器校準(zhǔn)規(guī)范
- 安全生產(chǎn)費(fèi)用提取臺帳
評論
0/150
提交評論