国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
ORACLE鎖

開發(fā)多用戶、數(shù)據(jù)庫驅(qū)動(dòng)的應(yīng)用時(shí),最大的難點(diǎn)之一:一方面要力爭取得最大限度的并發(fā)訪問,與此同時(shí)還要確保每個(gè)用戶能以一致的方式讀取和修改數(shù)據(jù);為此就有了鎖定(locking)機(jī)制。
鎖(lock)機(jī)制用于管理對共享資源的并發(fā)訪問,同時(shí)還能提供數(shù)據(jù)完整性和一致性。

 

有多少種數(shù)據(jù)庫,其中就可能有多少種實(shí)現(xiàn)鎖定的方法。時(shí)刻記住以下兩點(diǎn):
1、所有數(shù)據(jù)庫本質(zhì)上都不同。
2、為一個(gè)新的數(shù)據(jù)庫平臺設(shè)計(jì)應(yīng)用時(shí),對于數(shù)據(jù)庫如何工作不能做任何假設(shè)。
如SQL Server利用聚簇索引,就能按聚簇鍵的順序在整個(gè)表中插入行(而不是只在表的末尾插入),以改善SQLServer數(shù)據(jù)庫的并發(fā)性。而且默認(rèn)情況下,SQLServer每執(zhí)行一條語句后就會(huì)立即提交或回滾。這樣為了得到更大的并發(fā)性,但是會(huì)破壞事務(wù)完整性。

 

在Oracle中
事務(wù)是每個(gè)數(shù)據(jù)庫的核心
在必要時(shí)才提交,不要太快提交,以避免對系統(tǒng)帶來壓力。事務(wù)的大小只應(yīng)該根據(jù)業(yè)務(wù)邏輯來定。
只要需要,就應(yīng)該盡可能長時(shí)間地保持對數(shù)據(jù)所加的鎖。
行級鎖沒有相關(guān)的開銷,根本沒有。不論你是有1個(gè)行鎖,還是1000000個(gè)行鎖,專用于鎖定這個(gè)信息的“資源”數(shù)都是一樣的。
不同級別的鎖的開銷是一樣的
數(shù)據(jù)讀取器不會(huì)被數(shù)據(jù)寫入器阻塞。數(shù)據(jù)寫入器也不會(huì)被數(shù)據(jù)讀取器阻塞。

 

一、鎖定問題:丟失更新;需要使用某種鎖定策略,共有兩種鎖定策略:悲觀鎖定或樂觀鎖定。
1、悲觀鎖定;在試圖更新之前我們就把行鎖住了。
2、樂觀鎖定;鎖定都延遲到即將執(zhí)行更新之前才做。執(zhí)行更新的失敗可能性會(huì)加大。

實(shí)現(xiàn)方法有很多,以下介紹四種:
 a、在應(yīng)用中同時(shí)保留舊值和新值,存儲(chǔ)行的所有“前”(before)映像。
 b、使用版本列的樂觀鎖定;版本維護(hù):應(yīng)用、存儲(chǔ)、觸發(fā)器(開銷較大)。
 c、使用校驗(yàn)和的樂觀鎖定;計(jì)算散列或校驗(yàn)和有很多方法。
 計(jì)算散列或校驗(yàn)和是一個(gè)CPU密集型操作,相當(dāng)占用CPU。如果從網(wǎng)絡(luò)開銷角度看,計(jì)算散列或校驗(yàn)和只需在網(wǎng)絡(luò)上傳輸相當(dāng)小的散列值,而不是行的完整的前映像和后映像。 
 d、使用 ORA_ROWSCN的樂觀鎖定;Oracle10g函數(shù)ORA_ROWSCN,不僅很?。愃朴谏⒘校?jì)算時(shí)不是CPU密集型。
 它的工作與版本列技術(shù)很相似,但可由Oracle自動(dòng)執(zhí)行,而不需要在表中增加額外的列,也不需要額外的更新/維護(hù)代碼來更新這個(gè)值。ORA_ROWSCN默認(rèn)是在塊級維護(hù),一個(gè)塊上的多行會(huì)共享相同的ORA_ROWSCN值,除非在創(chuàng)建表時(shí),啟用ROWDEPENDENCIES支持在行級維護(hù)ORA_ROWSCN。

 

(一)阻塞
如果一個(gè)會(huì)話持有某個(gè)資源的鎖,另一個(gè)會(huì)話也請求這個(gè)資源,就會(huì)出現(xiàn)阻塞(blocking);在一個(gè)交互式應(yīng)用中被阻塞,很有可能同時(shí)存在丟失更新。
數(shù)據(jù)庫中有5條常見的DML語句可能會(huì)阻塞:INSERT、UPDATE、DELETE、MERGE和SELECT FORUPDATE。
1、阻塞的SELECT FOR UPDATE,解決方案只需增加NOWAIT子句即可。這樣應(yīng)用會(huì)告知調(diào)用者,這一行已經(jīng)鎖定。
通過使用SELECT FOR UPDATE NOWAIT查詢能做到:
 a、驗(yàn)證自從你查詢數(shù)據(jù)之后數(shù)據(jù)未被修改(防止丟失更新)。
 b、鎖住行(防止UPDATE或DELETE被阻塞)。
2、阻塞的INSERT;不多見。
 最常見的情況:
 a、一個(gè)帶主鍵或者有惟一約束的表,但有兩個(gè)會(huì)話試圖用同樣的值插入一行。讓用戶生成主鍵或惟一約束即可避免;也可通過內(nèi)置的DBMS_LOCK包實(shí)現(xiàn)手工鎖解決,但不推薦,因其開銷大。
 b、多個(gè)表通過引用完整性約束相互鏈接。當(dāng)子表所依賴的父表正在創(chuàng)建或刪除,對子表的插入可能會(huì)阻塞。在應(yīng)用中注意先后。
3、阻塞的Merge、Update和Delete。
不論是悲觀鎖定還是樂觀鎖定都可以利用SELECT FOR UPDATENOWAIT查詢來驗(yàn)證行未被修改。悲觀鎖定會(huì)在用戶有意修改數(shù)據(jù)那一刻使用這條語句。樂觀鎖定則在即將在數(shù)據(jù)庫中更新數(shù)據(jù)時(shí)使用這條語句。

 

(二)死鎖
A表有兩條數(shù)據(jù)1和2,兩個(gè)會(huì)話:會(huì)話a和會(huì)話b
阻塞:會(huì)話a更新數(shù)據(jù)1,會(huì)話b更新數(shù)據(jù)2;若會(huì)話b同時(shí)更新數(shù)據(jù)1則出現(xiàn)阻塞;若會(huì)話a也同時(shí)更新數(shù)據(jù)2是出現(xiàn)死鎖。
阻塞時(shí)前一個(gè)事務(wù)提交或回滾即可繼續(xù);死鎖則需犧牲一個(gè)更新,讓其更新回滾。
Oracle認(rèn)為死鎖很少見,所以每次出現(xiàn)死鎖時(shí)它都會(huì)在服務(wù)器上創(chuàng)建一個(gè)跟蹤文件。
導(dǎo)致死鎖原因:
1、外鍵未加索引。
2、表上的位圖索引遭到并發(fā)更新。
在以下兩種情況下,Oracle在修改父表后會(huì)對子表加一個(gè)全表鎖:
1、如果更新了父表的主鍵(倘若遵循關(guān)系數(shù)據(jù)庫的原則,即主鍵應(yīng)當(dāng)是不可變的),由于外鍵上沒有索引,所以子表會(huì)被鎖住。
2、如果刪除了父表中的一行,整個(gè)子表也會(huì)被鎖?。ㄓ捎谕怄I上沒有索引)。
在Oracle9i及以上版本中,全表鎖都是短期的,僅在DML操作期間存在,而不是在整個(gè)事務(wù)期間都存在。
如果存在未加索引的外鍵,只需對外鍵加索引,死鎖(以及大量其他的競爭問題)都不會(huì)出現(xiàn)。
,當(dāng)滿足以下條件時(shí)不需要加索引
1、沒有從父表刪除行。
2、沒有更新父表的惟一鍵/主鍵值(當(dāng)心工具有時(shí)會(huì)無意地更新主鍵?。?。
3、沒有從父表聯(lián)結(jié)子表(如DEPT聯(lián)結(jié)到EMP)。

 

(三)鎖升級
Oracle不會(huì)升級鎖,但會(huì)執(zhí)行鎖轉(zhuǎn)換(lock conversion)或鎖提升(lock promotion)。
比如用FORUPDATE子句從表中選擇一行,就會(huì)創(chuàng)建兩個(gè)鎖。一個(gè)鎖放在所選的行上(排他鎖;任何人都不能以獨(dú)占模式鎖定這一行)。另一個(gè)鎖是ROWSHARE TABLE鎖,放在表本身上,防止其他會(huì)話在表上放置一個(gè)排他鎖。

 

二、鎖類型
Oracle中的鎖定過程如下:
(1) 找到想鎖定的那一行的地址。
(2) 到達(dá)那一行。
(3) 通過數(shù)據(jù)的閂屬性鎖定這一數(shù)據(jù)行(該行若已經(jīng)鎖定,則等待鎖住它的事務(wù)結(jié)束,除非使用了NOWAIT選項(xiàng))。
ORACLE通過數(shù)據(jù)本身來管理行鎖定和事務(wù)信息。
Oracle中主要有3類鎖,具體是:
(一)DML鎖(DML lock):DML代表數(shù)據(jù)操縱語言(Data ManipulationLanguage)。包含SELECT、INSERT、UPDATE、MERGE和DELETE語句。DML鎖機(jī)制允許并發(fā)執(zhí)行數(shù)據(jù)修改。DML鎖(DMLLock)確保一次只有一個(gè)人能修改某一行,且處理一個(gè)表時(shí)別人不能刪除這個(gè)表。
1. TX鎖(事務(wù)鎖)
事務(wù)發(fā)起第一個(gè)修改時(shí)會(huì)得到TX鎖(事務(wù)鎖),而且會(huì)一直持有這個(gè)鎖,直至事務(wù)執(zhí)行提交(COMMIT)或回滾(ROLLBACK)。
2. TM (DML Enqueue)鎖
TM鎖(TM lock)用于確保在修改表的內(nèi)容時(shí),表的結(jié)構(gòu)不會(huì)改變。
(二)DDL鎖(DDL lock):DDL代表數(shù)據(jù)定義語言(Data DefinitionLanguage),如CREATE和ALTER語句等。DDL鎖可以保護(hù)對象結(jié)構(gòu)定義。
DDL默認(rèn)總會(huì)提交。有3種類型的DDL鎖:
1. 排他DDL鎖(Exclusive DDL lock):這會(huì)防止其他會(huì)話得到它們自己的DDL鎖或TM(DML)鎖。
2. 共享DDL鎖(Share DDL lock):保護(hù)所引用對象的結(jié)構(gòu)不被其他會(huì)話修改,但是允許修改數(shù)據(jù)。
3. 可中斷解析鎖(Breakable parselocks):允許一個(gè)對象(如共享池中緩存的一個(gè)查詢計(jì)劃)向另外某個(gè)對象注冊其依賴性。如果在被依賴的對象上執(zhí)行DDL,Oracle會(huì)查看已經(jīng)對該對象注冊了依賴性的對象列表,并使這些對象無效。
通過DBA_DDL_LOCKS可查看DDL鎖的信息;開發(fā)人員可通過這個(gè)視圖發(fā)現(xiàn)測試或開發(fā)系統(tǒng)中某段代碼無法編譯時(shí),將會(huì)掛起并最終超時(shí)。這說明有人正運(yùn)行這段代碼,可用該視圖查看誰在運(yùn)行。對于GRANTS和對象的其他類型的DDL也是一樣。
同時(shí)可用SYS用戶運(yùn)行[ORACLE_HOME]/rdbms/admin目錄下的catblock.sql腳本來安裝相關(guān)鎖視圖。
(三)內(nèi)部鎖和閂:Oracle使用這些鎖來保護(hù)其內(nèi)部數(shù)據(jù)結(jié)構(gòu)。例如,Oracle解析一個(gè)查詢并生成優(yōu)化的查詢計(jì)劃時(shí),它會(huì)把庫緩存“臨時(shí)閂”,將計(jì)劃放在那里,以供其他會(huì)話使用。閂(latch)是Oracle采用的一種輕量級的低級串行化設(shè)備,功能上類似于鎖。閂是數(shù)據(jù)庫中導(dǎo)致競爭的一個(gè)常見原因。輕量級指的是閂的實(shí)現(xiàn),而不是閂的作用。用于協(xié)調(diào)對共享數(shù)據(jù)結(jié)構(gòu)、對象和文件的多用戶訪問。
Oracle使用測試和設(shè)置(test and set)及比較和交換(compare andswap)之類的原子指令來處理閂。由于設(shè)置和釋放閂的指令是原子性的,盡管可能有多個(gè)進(jìn)程同時(shí)請求,但操作系統(tǒng)本身可保證只有一個(gè)進(jìn)程能測試和設(shè)置閂。指令僅僅是一個(gè)指令而已,它執(zhí)行得可能非???。閂只保持很短的時(shí)間,而且提供了一種清理機(jī)制,萬一某個(gè)閂持有者在持有閂時(shí)異常地死掉,通過PMON執(zhí)行清理。
隊(duì)列鎖(enqueue是一種更復(fù)雜的串行化設(shè)備。與閂的區(qū)別在于,隊(duì)列鎖允許請求者排隊(duì)等待資源。對于閂請求,請求者會(huì)話會(huì)立即得到通知是否得到閂。且對于隊(duì)列鎖,請求者會(huì)話會(huì)阻塞,直至真正得到鎖。
閂是一種串行化設(shè)備,而串行化設(shè)備會(huì)妨礙可擴(kuò)縮性。
等待閂是一個(gè)代價(jià)很高的操作,嘗試得到閂過程會(huì)耗費(fèi)大量的CPU時(shí)間。閂未能立即可用就得等待,若是多CPU機(jī)器,會(huì)話就會(huì)自旋(spin),即在循環(huán)中反復(fù)地嘗試來得到閂。
(四)手動(dòng)鎖定和用戶定義鎖
介入這種鎖定活動(dòng)。有以下選擇:
1.通過一條SQL語句手動(dòng)地鎖定行數(shù)據(jù)。如SELECT...FOR UPDATE語句就是手動(dòng)鎖定數(shù)據(jù)的一種主要方法。
2.通過DBMS_LOCK包創(chuàng)建我們自己的鎖。如外部文件ORACLE不可協(xié)調(diào)。

 

附:有時(shí)數(shù)據(jù)庫掛起,面對一個(gè)看上去無法解決的掛起問題,運(yùn)行一個(gè)查詢來檢測外鍵是不是沒有索引,并建議對導(dǎo)致問題的外鍵加上索引,就能很好地解決問題

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Oracle數(shù)據(jù)完整性和鎖機(jī)制
第十三章 數(shù)據(jù)一致性和并發(fā)性
oracle事務(wù)與鎖
oracle的鎖與并發(fā)機(jī)制
事務(wù)與鎖的一些總結(jié)(轉(zhuǎn))
MySQL在并發(fā)場景下的問題及解決思路
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服