真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Oracle鎖的面試題有哪些

本篇內(nèi)容介紹了“Oracle鎖的面試題有哪些”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

成都創(chuàng)新互聯(lián)公司的客戶來自各行各業(yè),為了共同目標(biāo),我們在工作上密切配合,從創(chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對我們的要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。專業(yè)領(lǐng)域包括成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、電商網(wǎng)站開發(fā)、微信營銷、系統(tǒng)平臺開發(fā)。

請問Oracle數(shù)據(jù)庫鎖的作用是什么?

多用戶系統(tǒng)并發(fā)訪問并修改數(shù)據(jù)時,保護數(shù)據(jù)的一致性和完整性。

鎖是一種機制,多個事務(wù)同時訪問一個數(shù)據(jù)庫對象時,該機制可以實現(xiàn)對并發(fā)的控制。

Oracle正是使用鎖機制來實現(xiàn)系統(tǒng)的高并發(fā),利用不同類型的排它鎖或者共享鎖來管理并發(fā)會話對數(shù)據(jù)的操作。數(shù)據(jù)庫是一個多用戶使用的共享資源。當(dāng)多個用戶并發(fā)地存取修改同一數(shù)據(jù)時,若對并發(fā)操作不加控制就可能會讀取和存儲不正確的數(shù)據(jù),破壞數(shù)據(jù)庫的一致性和完整性。Oracle數(shù)據(jù)庫通過其鎖機制在事務(wù)之間提供數(shù)據(jù)并發(fā)性、一致性和完整性。鎖定是自動發(fā)生的,通常不需要用戶操作。

請問Oracle鎖存儲在哪里?

在oracle數(shù)據(jù)庫中,不存在真正意義上屬于某個對象或數(shù)據(jù)的鎖。oracle鎖的信息是數(shù)據(jù)塊的一個物理屬性,而不是邏輯上屬于某個表或某個行。Oracle的鎖機制是一種輕量級的鎖定機制,不是通過構(gòu)建鎖列表來進行數(shù)據(jù)的鎖定管理,而是直接將鎖作為數(shù)據(jù)塊的屬性,存儲在數(shù)據(jù)塊首部。在 Oracle 數(shù)據(jù)庫中,它并不是對某個表加上鎖或者某幾行加上鎖, 鎖是以數(shù)據(jù)塊的一個屬性存在的。 也就是說, 每個數(shù)據(jù)塊本身就存儲著自己數(shù)據(jù)塊中數(shù)據(jù)的信息,這個地方叫 ITL( Interested Transaction List), 凡是在這個數(shù)據(jù)塊上有活動的事務(wù),它的信息就會記錄在這里面供后續(xù)的操作查詢,一保證事務(wù)的一致性。

一:根據(jù)獲取鎖的方式,鎖分為以下兩種

排它鎖(Exclusive Locks,即X鎖)和共享鎖(Share Locks,即S鎖)。

1.1排它鎖:事務(wù)設(shè)置排它鎖后,該事務(wù)單獨獲得此資源,另一事務(wù)不能在此事務(wù)提交之前獲得相同對象的共享鎖或排它鎖。

可以理解為寫鎖,這種鎖是防止資源的共享,用于修改數(shù)據(jù)。如果一個事物給某個數(shù)據(jù)加了排它鎖,其它事物就不能對它再加任何鎖,直到事物完結(jié),排它鎖釋放。

1.2共享鎖:共享鎖使一個事務(wù)對特定數(shù)據(jù)庫資源進行共享訪問,另一事務(wù)也可對此資源進行訪問或獲得相同共享鎖。共享鎖為事務(wù)提供高并發(fā)性,容易造成死鎖和數(shù)據(jù)更新丟失。

可以理解為讀鎖,加了共享鎖的數(shù)據(jù),只能共享讀,不能再給它加排它鎖進行寫的操作。

二:根據(jù)系統(tǒng)并發(fā)情況,鎖分為以下兩種

悲觀鎖和樂觀鎖。

2.1悲觀鎖

所謂的悲觀鎖:顧名思義,就是很悲觀,每次去修改數(shù)據(jù)的時候都認為別人也會去修改相同的書,所以每次修改數(shù)據(jù)的時候都會上鎖。這樣別人修改數(shù)據(jù)的時候就要等待直到鎖的釋放。以保證數(shù)據(jù)的一致性。

悲觀鎖有兩種方式(從SQL語句的區(qū)別來看):

1. 執(zhí)行select xxx for update操作時,數(shù)據(jù)會被鎖定,只有執(zhí)行comit或rollover才會釋放

2. 執(zhí)行select xxx for update nowait操作時,數(shù)據(jù)也會被鎖定,其他人訪問時或返回ORA-00054錯誤,內(nèi)容是資源正忙,需要采取相應(yīng)的業(yè)務(wù)措施進行處理。

2.2樂觀鎖:

所謂的樂觀鎖:就是很樂觀,每次去修改數(shù)據(jù)的時候都認為別人不會去修改相同的數(shù)據(jù),所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數(shù)據(jù)。

因此,需要在提交時保證數(shù)據(jù)一致性,如果不一致,則返回錯誤,由程序本身的邏輯進行處理。

樂觀鎖的實現(xiàn)主要有三種方式:

a. 通過比較提交前后的數(shù)據(jù)是否發(fā)生變化來判斷是否存在數(shù)據(jù)沖突

b. 通過在表中增加版本戳列,來標(biāo)示是否發(fā)生了變化

c. 通過比對表的時間戳來判斷是否出現(xiàn)了版本變化

可以通過trigger或存儲過程實現(xiàn)該樂觀鎖。

oracle在數(shù)據(jù)更新時通常時候的是樂觀鎖,任何一個以UPDATE...SET開始并且不是以SELECT...FOR UPDATE進行操作的命令就是一個樂觀鎖的例子。

悲觀鎖和樂觀鎖使用場景:

1. 如果系統(tǒng)并發(fā)量不大且不允許臟讀,可以使用悲觀鎖解決并發(fā)問題。

2. 如果系統(tǒng)并發(fā)非常大的話,悲觀鎖會帶來很大性能問題,所以一般采用樂觀鎖。

3. 如果系統(tǒng)讀比較多,寫比較少,也應(yīng)該使用樂觀鎖,可以提高吞吐量

三:根據(jù)保護對象的不同,Oracle數(shù)據(jù)庫鎖可以分為以下幾大類

(1) DML lock(data locks,數(shù)據(jù)鎖):用于保護數(shù)據(jù)的完整性;

(2) DDL lock(dictionary locks,字典鎖):用于保護數(shù)據(jù)庫對象的結(jié)構(gòu)(例如表、視圖、索引的結(jié)構(gòu)定義);

(3) System Locks:保護內(nèi)部數(shù)據(jù)庫結(jié)構(gòu)。

3.1DML鎖

DML鎖(也稱為數(shù)據(jù)鎖)保證了多個用戶并發(fā)訪問的數(shù)據(jù)的完整性。

DML語句自動獲取下列類型的鎖:

3.1.1行鎖(TX)

行級鎖是粒度最細的DML鎖,主要用來控制數(shù)據(jù)行的修改、刪除操作。當(dāng)對表中的某行數(shù)據(jù)進行修改時,需要對其加上行級排他鎖,防止其他事物也對其進行修改,等數(shù)據(jù)修改完,事物提交時,自動釋放。

3.1.2表鎖(TM)

TM 鎖用于確保在修改表的內(nèi)容時,表的結(jié)構(gòu)不會改變,例如防止在 DML 語句執(zhí)行期間相關(guān)的表被移除。當(dāng)用戶對表執(zhí)行 DDL 或 DML 操作時,將獲取一個此表的表級鎖。

當(dāng)事務(wù)獲得行鎖后,此事務(wù)也將自動獲得該行的表鎖,以防止其它事務(wù)進行 DDL 語句影響記錄行的更新。

TM 鎖包括了 SS、 SX(RX)、 S、SRX(SSX)、 X 等多種模式,在數(shù)據(jù)庫中用 0-6 來表示。不同的 SQL 操作產(chǎn)生不同類型的 TM 鎖.

R是ROW行,S是SHARE共享,X是exclusive排他,獨占鎖的意思。

鎖模式:0  鎖描述:none

說明:沒有鎖,一般的SELECT,在表和行上都是0級鎖

鎖模式:1  鎖描述:NULL

說明:Select有時會在v$locked_object出現(xiàn)。 其實起不了鎖定的作用,他就是有一個通知的功能,根本阻止不了DDL,類似把執(zhí)行計劃中的對象通知對象所屬的會話。

鎖模式:2  鎖描述:SS(Row-S)行級共享鎖

說明:表結(jié)構(gòu)共享鎖,只跟X沖突,因為其他都是共享鎖,RX,SRX雖然也有X,但是是行的X,表上還是共享的意思,2級鎖在表級別和0-5級不沖突。

這個鎖,也稱為子共享表鎖(SS),表示持有表上鎖的事務(wù)已經(jīng)鎖定了表中的行,并打算更新它們。行共享鎖是表鎖中限制最少的一種模式,它為表提供了最高程度的并發(fā)性。

相關(guān)操作:Select for update,Lock For Update,Lock Row Share 

鎖模式:3  鎖描述:SX(Row-X)行級排他鎖

說明:表結(jié)構(gòu)共享鎖+被操作的記錄的排它鎖(若有DML操作),這個鎖,也稱為subexclusive table lock (SX),通常表示持有這個鎖的事務(wù)已經(jīng)更新了表行或發(fā)出了SELECT…for update。SX鎖允許其他事務(wù)并發(fā)地查詢、插入、更新、刪除或鎖定同一表中的行。因此,SX鎖允許多個事務(wù)同時獲得同一表的SX和子共享表鎖。

相關(guān)操作:Insert, Update, Delete, Lock Row Exclusive

鎖模式:4  鎖描述:S(Share)共享鎖

說明:表結(jié)構(gòu)共享鎖+所有記錄共享鎖(隱含),事務(wù)持有的共享表鎖允許其他事務(wù)查詢該表(SELECT…for update除外),但僅當(dāng)單個事務(wù)持有共享表鎖時才允許更新。因為多個事務(wù)可能同時持有一個共享表鎖,持有這個鎖不足以確保一個事務(wù)可以修改表。

相關(guān)操作:Create Index, Lock Share

鎖模式:5  鎖描述:SRX(S/Row-X)共享行級排他鎖

說明:表結(jié)構(gòu)共享鎖+所有記錄排它鎖(隱含),這個鎖也稱為share-subexclusive table lock (SSX),比共享鎖的限制更嚴格。一次只有一個事務(wù)可以獲得給定表上的SSX鎖。事務(wù)持有的SSX鎖允許其他事務(wù)查詢表(除了SELECT…for update)但不更新表。

相關(guān)操作:Lock Share Row Exclusive 

鎖模式:6  鎖描述:X(Exclusive)排他鎖

說明:表結(jié)構(gòu)排它鎖,這個鎖是最嚴格的,禁止其他事務(wù)執(zhí)行任何類型的DML語句或在表上放置任何類型的鎖。

相關(guān)操作:Alter table, Drop table, Drop Index, Truncate table, Lock Exclusive

這幾種模式看上去是不是感覺特別亂,不好理解,網(wǎng)上有一個通俗易懂的例子如下:

http://blog.itpub.net/30126024/viewspace-2156232/

參考Maclean的講座,用一個珠寶店來做比喻說明:

珠寶店可以給大家免費參觀,可以讓你預(yù)定,可以試用后覺得好再買,可以把店都買下來。

第0類人,免費參觀珠寶店的人

第1類人,免費參觀珠寶店的老弱病殘孕的客人

第2類人,預(yù)定了試用期,先買來幾天,如果試用后覺得好再買

第3類人,直接到店里的目的就是立即購買

第4類人,把整個店的珠寶包下來,讓別人參觀,預(yù)定,但是不能買賣(這在ORACLE中叫只讀鎖,只允許別人讀,也就是只允許第0,1,2類人來珠寶店,讓別人只讀方式的參觀,不允許買賣,再來個第4類人,還是允許的,因為大家雖然都想包,但是大家的目的都是分享,而不是獨占,所以是可以兼容的)

第5類人,它跟第4類人的區(qū)別只有一條,就是第5類人包下整個珠寶店后,另一個第5類人就不允許再包了(這在ORACLE中叫寫鎖定),也就是第5類人是單通道的,你在珠寶店里只能找到1個第5類人,不可能找出第2個第5類人,但是第5類人把珠寶店包下來后,仍然可以讓第0,1,2類人參觀,但不允許買賣

第6類人,它把整個珠寶店盤下來,不允許任何人有目的的參觀,只允許免費參觀,它是獨占的,只允許0,1類人參觀,其他人都不允許

--以上第2類人預(yù)定的,所以第3類跟6類人不兼容

--以上第3類人是要買珠寶的,所以第3類跟4,5,6類人都不兼容。

3.2DDL鎖

當(dāng)正在進行的DDL操作作用于或引用對象時,數(shù)據(jù)字典(DDL)鎖保護模式對象的定義。

在DDL操作期間,只有修改或引用的單個架構(gòu)對象才會被鎖定。數(shù)據(jù)庫從不鎖定整個數(shù)據(jù)字典。

Oracle數(shù)據(jù)庫代表任何需要DDL鎖的DDL事務(wù)自動獲取DDL鎖。用戶不能顯式請求DDL鎖。例如,如果用戶創(chuàng)建了一個存儲過程,那么Oracle數(shù)據(jù)庫會自動為過程定義中引用的所有模式對象獲取DDL鎖。DDL鎖防止在過程編譯完成之前更改或刪除這些對象。

3.2.1DDL排他鎖

排他DDL鎖阻止其他會話獲得DDL或DML鎖。

大多數(shù)DDL操作需要對一個資源使用獨占DDL鎖,以防止對其他DDL操作的破壞干擾,這些操作可能修改或引用相同的模式對象。例如,當(dāng)ALTER TABLE添加一個列時,DROP TABLE不允許刪除一個表,反之亦然。

3.2.2DDL共享鎖

資源的共享DDL鎖可以防止對沖突的DDL操作的破壞性干擾,但允許對類似的DDL操作進行數(shù)據(jù)并發(fā)。

這些鎖會保護所引用對象的結(jié)構(gòu),使之不會被其他會話修改,但是允許修改數(shù)據(jù)。

例如,在運行CREATE PROCEDURE語句時,包含的事務(wù)為所有引用的表獲取共享DDL鎖。其他事務(wù)可以并發(fā)地創(chuàng)建引用相同表的過程,并獲取相同表上的并發(fā)共享DDL鎖,但是任何事務(wù)都不能獲得任何引用表上的獨占DDL鎖。

共享DDL鎖在DDL語句執(zhí)行和自動提交期間有效。因此,持有共享DDL鎖的事務(wù)可以保證引用的模式對象的定義在事務(wù)期間保持不變。

3.2.3 DDL可分解的解析鎖

一個解析鎖被稱為一個可分解的解析鎖,因為它不禁止任何DDL操作,并且可以被分解為允許沖突的DDL操作。

這些鎖允許一個對象(如共享池中緩存的一個查詢計劃)向另外某個對象注冊其依賴性。如果在被依賴的對象上執(zhí)行DDL,Oracle會查看已經(jīng)對該對象注冊了依賴性的對象列表,并使這些對象無效。因此,這些鎖是“可分解的”,它們不防止DDL出現(xiàn)。

3.3系統(tǒng)鎖

Oracle數(shù)據(jù)庫使用各種類型的系統(tǒng)鎖來保護內(nèi)部數(shù)據(jù)庫和內(nèi)存結(jié)構(gòu)。這些機制對于用戶來說是透明的。

3.3.1閂鎖 Latches

閂鎖是一種簡單的低級序列化機制,用于協(xié)調(diào)對共享數(shù)據(jù)結(jié)構(gòu)、對象和文件的多用戶訪問。

一般來說,latch由三種內(nèi)存元素成:pid(進程id),內(nèi)存地址和內(nèi)存長度。Latch保證對共享數(shù)據(jù)結(jié)構(gòu)的排它性訪問,以此來保證內(nèi)存結(jié)構(gòu)的完整性不受到損壞。在多個會話同時修改或者檢視(inspect)sga中同一個內(nèi)存結(jié)構(gòu)時,必須串行化訪問以 保證sga中數(shù)據(jù)結(jié)構(gòu)的完整性,latch 不會造成阻塞,是只會等待。當(dāng)前一個進程釋放latch后,如果其他多個進程同時請求的話,他們之間將出現(xiàn)競爭,沒有一個入隊機制,一旦前面進程釋放鎖定,后面的進程就蜂擁而上,沒有先來后到的概念,并且這一切都發(fā)生的非???,因為Latch的特點是快而短暫。

latch 爭用多半要考慮系統(tǒng)及數(shù)據(jù)庫自身設(shè)計問題,如綁定變量,熱塊及參數(shù)設(shè)置是否合理。

如多用戶對主鍵的刪除或者修改,是否有用戶使用select… for update這樣的語法,外鍵是否創(chuàng)建索引等。

閂鎖保護共享內(nèi)存資源在被多個進程訪問時不受損壞。具體來說,鎖存保護數(shù)據(jù)結(jié)構(gòu)不受以下情況的影響:

?多個會話并發(fā)修改

?當(dāng)被一個會話讀取的同時被另一個會話修改

?當(dāng)訪問時釋放重新分配內(nèi)存

通常,在SGA中單個閂保護多個對象,例如,后臺進程(例如DBWn和LGWR)從共享池(shared pool)分配內(nèi)存創(chuàng)建數(shù)據(jù)結(jié)構(gòu),為了分配這些內(nèi)存,這些進程用一個共享池閂來序列化訪問,防止兩個進程同時檢查或修改共享池。內(nèi)存被分配后,其它進程可能需要訪問共享池,例如庫緩存(library cache),用于解析,這時,進程閂只鎖庫緩存,不鎖整個共享池。

與隊列鎖(如行鎖)不同,閂不允許session排隊。當(dāng)一個閂鎖可用時,發(fā)起請求的第一個session獲取到閂。當(dāng)一個進程在一個循環(huán)中重復(fù)地請求一個閂,叫做Latch spinning,而一個進程等待請求閂期間睡眠釋放CPU,則叫做latch sleeping。

通常,一個Oracle進程在操作或查看一個數(shù)據(jù)結(jié)構(gòu)時只獲取閂極短的時間,例如,當(dāng)處理一個雇員的薪水更新時,數(shù)據(jù)庫可以獲取和釋放幾千次鎖。閂的實現(xiàn)依賴于操作系統(tǒng),特別是對于怎么處理閂的等待。

閂的增加意味著并行度的減少,例如,過多的硬操作會競爭庫緩存閂。V$LATCH視圖包含了每種閂使用的統(tǒng)計信息,包括請求和等待每個閂鎖的次數(shù)。

3.3.2互斥鎖 Mutexes

Mutex作為Latch的替代品,具有更快速獲得,更小等優(yōu)勢。

獲取一個mutex進需要大約30~35個指令, 而Latch則需要150~200個指令。一個mutex結(jié)構(gòu)的大小大約為16 bytes,而在10.2版本中一個latch需要112個bytes,在更早的版本中是200個bytes。 

互斥對象(互斥對象)是一種低級別的機制,它可以防止內(nèi)存中的對象在被并發(fā)進程訪問時老化或損壞?;コ怄i類似于閂,但閂通常保護一組對象,而互斥鎖保護單個對象。

互斥鎖有幾個好處:

?互斥鎖可以減少爭用。

因為一個閂保護多個對象,所以當(dāng)多個進程試圖同時訪問這些對象時,它可能成為瓶頸。通過序列化對單個對象而不是組的訪問,互斥鎖減速了競爭。

?互斥鎖消耗的內(nèi)存比閂更少。

?在共享模式下,互斥鎖允許多個會話并發(fā)引用。

3.3.3內(nèi)部鎖 Internal Locks

內(nèi)部鎖是比閂和互斥鎖更高級、更復(fù)雜的機制,可用于各種目的。

數(shù)據(jù)庫使用以下類型的內(nèi)部鎖:

?字典緩存鎖

這些鎖的持續(xù)時間非常短,當(dāng)字典緩存的條目被修改或使用時,它們保證被解析的語句不會看到不一致的對象定義。字典緩存鎖可以是共享的,也可以是獨占的。共享鎖在解析完成時釋放,而獨占鎖在DDL操作完成時釋放。

?文件和日志管理鎖

這些鎖保護各種文件。例如,一種內(nèi)部鎖保護控制文件保證一次只有一個進程可以修改它。另一個鎖協(xié)調(diào)在線重做日志文件的使用和歸檔。數(shù)據(jù)文件被鎖定,以確保多個實例以共享模式掛載數(shù)據(jù)庫,或一個實例以獨占模式掛載數(shù)據(jù)庫。因為文件鎖和日志鎖指示文件的狀態(tài),所以這些鎖必須保持很長時間。

?表空間和撤銷段鎖

這些鎖保護表空間和撤銷段。例如,訪問數(shù)據(jù)庫的所有實例必須就表空間是聯(lián)機還是脫機達成一致。undo段被鎖定,保證只有一個數(shù)據(jù)庫實例可以寫入undo。

“Oracle鎖的面試題有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!


分享標(biāo)題:Oracle鎖的面試題有哪些
文章分享:http://weahome.cn/article/gdcohi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部