您好,登錄后才能下訂單哦!
本篇內容介紹了“Oracle鎖的面試題有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
請問Oracle數據庫鎖的作用是什么?
多用戶系統并發訪問并修改數據時,保護數據的一致性和完整性。
鎖是一種機制,多個事務同時訪問一個數據庫對象時,該機制可以實現對并發的控制。
Oracle正是使用鎖機制來實現系統的高并發,利用不同類型的排它鎖或者共享鎖來管理并發會話對數據的操作。數據庫是一個多用戶使用的共享資源。當多個用戶并發地存取修改同一數據時,若對并發操作不加控制就可能會讀取和存儲不正確的數據,破壞數據庫的一致性和完整性。Oracle數據庫通過其鎖機制在事務之間提供數據并發性、一致性和完整性。鎖定是自動發生的,通常不需要用戶操作。
請問Oracle鎖存儲在哪里?
在oracle數據庫中,不存在真正意義上屬于某個對象或數據的鎖。oracle鎖的信息是數據塊的一個物理屬性,而不是邏輯上屬于某個表或某個行。Oracle的鎖機制是一種輕量級的鎖定機制,不是通過構建鎖列表來進行數據的鎖定管理,而是直接將鎖作為數據塊的屬性,存儲在數據塊首部。在 Oracle 數據庫中,它并不是對某個表加上鎖或者某幾行加上鎖, 鎖是以數據塊的一個屬性存在的。 也就是說, 每個數據塊本身就存儲著自己數據塊中數據的信息,這個地方叫 ITL( Interested Transaction List), 凡是在這個數據塊上有活動的事務,它的信息就會記錄在這里面供后續的操作查詢,一保證事務的一致性。
一:根據獲取鎖的方式,鎖分為以下兩種
排它鎖(Exclusive Locks,即X鎖)和共享鎖(Share Locks,即S鎖)。
1.1 排它鎖:事務設置排它鎖后,該事務單獨獲得此資源,另一事務不能在此事務提交之前獲得相同對象的共享鎖或排它鎖。
可以理解為寫鎖,這種鎖是防止資源的共享,用于修改數據。如果一個事物給某個數據加了排它鎖,其它事物就不能對它再加任何鎖,直到事物完結,排它鎖釋放。
1.2 共享鎖:共享鎖使一個事務對特定數據庫資源進行共享訪問,另一事務也可對此資源進行訪問或獲得相同共享鎖。共享鎖為事務提供高并發性,容易造成死鎖和數據更新丟失。
可以理解為讀鎖,加了共享鎖的數據,只能共享讀,不能再給它加排它鎖進行寫的操作。
二:根據系統并發情況,鎖分為以下兩種
悲觀鎖和樂觀鎖。
2.1悲觀鎖:
所謂的悲觀鎖:顧名思義,就是很悲觀,每次去修改數據的時候都認為別人也會去修改相同的書,所以每次修改數據的時候都會上鎖。這樣別人修改數據的時候就要等待直到鎖的釋放。以保證數據的一致性。
悲觀鎖有兩種方式(從SQL語句的區別來看):
1. 執行select xxx for update操作時,數據會被鎖定,只有執行comit或rollover才會釋放
2. 執行select xxx for update nowait操作時,數據也會被鎖定,其他人訪問時或返回ORA-00054錯誤,內容是資源正忙,需要采取相應的業務措施進行處理。
2.2樂觀鎖:
所謂的樂觀鎖:就是很樂觀,每次去修改數據的時候都認為別人不會去修改相同的數據,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據。
因此,需要在提交時保證數據一致性,如果不一致,則返回錯誤,由程序本身的邏輯進行處理。
樂觀鎖的實現主要有三種方式:
a. 通過比較提交前后的數據是否發生變化來判斷是否存在數據沖突
b. 通過在表中增加版本戳列,來標示是否發生了變化
c. 通過比對表的時間戳來判斷是否出現了版本變化
可以通過trigger或存儲過程實現該樂觀鎖。
oracle在數據更新時通常時候的是樂觀鎖,任何一個以UPDATE...SET開始并且不是以SELECT...FOR UPDATE進行操作的命令就是一個樂觀鎖的例子。
悲觀鎖和樂觀鎖使用場景:
1. 如果系統并發量不大且不允許臟讀,可以使用悲觀鎖解決并發問題。
2. 如果系統并發非常大的話,悲觀鎖會帶來很大性能問題,所以一般采用樂觀鎖。
3. 如果系統讀比較多,寫比較少,也應該使用樂觀鎖,可以提高吞吐量
三:根據保護對象的不同,Oracle數據庫鎖可以分為以下幾大類
(1) DML lock(data locks,數據鎖):用于保護數據的完整性;
(2) DDL lock(dictionary locks,字典鎖):用于保護數據庫對象的結構(例如表、視圖、索引的結構定義);
(3) System Locks:保護內部數據庫結構。
3.1 DML鎖
DML鎖(也稱為數據鎖)保證了多個用戶并發訪問的數據的完整性。
DML語句自動獲取下列類型的鎖:
3.1.1行鎖(TX)
行級鎖是粒度最細的DML鎖,主要用來控制數據行的修改、刪除操作。當對表中的某行數據進行修改時,需要對其加上行級排他鎖,防止其他事物也對其進行修改,等數據修改完,事物提交時,自動釋放。
3.1.2表鎖(TM)
TM 鎖用于確保在修改表的內容時,表的結構不會改變,例如防止在 DML 語句執行期間相關的表被移除。當用戶對表執行 DDL 或 DML 操作時,將獲取一個此表的表級鎖。
當事務獲得行鎖后,此事務也將自動獲得該行的表鎖,以防止其它事務進行 DDL 語句影響記錄行的更新。
TM 鎖包括了 SS、 SX(RX)、 S、SRX(SSX)、 X 等多種模式,在數據庫中用 0-6 來表示。不同的 SQL 操作產生不同類型的 TM 鎖.
R是ROW行,S是SHARE共享,X是exclusive排他,獨占鎖的意思。
鎖模式:0 鎖描述:none
說明:沒有鎖,一般的SELECT,在表和行上都是0級鎖
鎖模式:1 鎖描述:NULL
說明:Select有時會在v$locked_object出現。 其實起不了鎖定的作用,他就是有一個通知的功能,根本阻止不了DDL,類似把執行計劃中的對象通知對象所屬的會話。
鎖模式:2 鎖描述:SS(Row-S)行級共享鎖
說明:表結構共享鎖,只跟X沖突,因為其他都是共享鎖,RX,SRX雖然也有X,但是是行的X,表上還是共享的意思,2級鎖在表級別和0-5級不沖突。
這個鎖,也稱為子共享表鎖(SS),表示持有表上鎖的事務已經鎖定了表中的行,并打算更新它們。行共享鎖是表鎖中限制最少的一種模式,它為表提供了最高程度的并發性。
相關操作:Select for update,Lock For Update,Lock Row Share
鎖模式:3 鎖描述:SX(Row-X)行級排他鎖
說明:表結構共享鎖+被操作的記錄的排它鎖(若有DML操作),這個鎖,也稱為subexclusive table lock (SX),通常表示持有這個鎖的事務已經更新了表行或發出了SELECT…for update。SX鎖允許其他事務并發地查詢、插入、更新、刪除或鎖定同一表中的行。因此,SX鎖允許多個事務同時獲得同一表的SX和子共享表鎖。
相關操作:Insert, Update, Delete, Lock Row Exclusive
鎖模式:4 鎖描述:S(Share)共享鎖
說明:表結構共享鎖+所有記錄共享鎖(隱含),事務持有的共享表鎖允許其他事務查詢該表(SELECT…for update除外),但僅當單個事務持有共享表鎖時才允許更新。因為多個事務可能同時持有一個共享表鎖,持有這個鎖不足以確保一個事務可以修改表。
相關操作:Create Index, Lock Share
鎖模式:5 鎖描述:SRX(S/Row-X)共享行級排他鎖
說明:表結構共享鎖+所有記錄排它鎖(隱含),這個鎖也稱為share-subexclusive table lock (SSX),比共享鎖的限制更嚴格。一次只有一個事務可以獲得給定表上的SSX鎖。事務持有的SSX鎖允許其他事務查詢表(除了SELECT…for update)但不更新表。
相關操作:Lock Share Row Exclusive
鎖模式:6 鎖描述:X(Exclusive)排他鎖
說明:表結構排它鎖,這個鎖是最嚴格的,禁止其他事務執行任何類型的DML語句或在表上放置任何類型的鎖。
相關操作:Alter table, Drop table, Drop Index, Truncate table, Lock Exclusive
這幾種模式看上去是不是感覺特別亂,不好理解,網上有一個通俗易懂的例子如下:
http://blog.itpub.net/30126024/viewspace-2156232/
參考Maclean的講座,用一個珠寶店來做比喻說明:
珠寶店可以給大家免費參觀,可以讓你預定,可以試用后覺得好再買,可以把店都買下來。
第0類人,免費參觀珠寶店的人
第1類人,免費參觀珠寶店的老弱病殘孕的客人
第2類人,預定了試用期,先買來幾天,如果試用后覺得好再買
第3類人,直接到店里的目的就是立即購買
第4類人,把整個店的珠寶包下來,讓別人參觀,預定,但是不能買賣(這在ORACLE中叫只讀鎖,只允許別人讀,也就是只允許第0,1,2類人來珠寶店,讓別人只讀方式的參觀,不允許買賣,再來個第4類人,還是允許的,因為大家雖然都想包,但是大家的目的都是分享,而不是獨占,所以是可以兼容的)
第5類人,它跟第4類人的區別只有一條,就是第5類人包下整個珠寶店后,另一個第5類人就不允許再包了(這在ORACLE中叫寫鎖定),也就是第5類人是單通道的,你在珠寶店里只能找到1個第5類人,不可能找出第2個第5類人,但是第5類人把珠寶店包下來后,仍然可以讓第0,1,2類人參觀,但不允許買賣
第6類人,它把整個珠寶店盤下來,不允許任何人有目的的參觀,只允許免費參觀,它是獨占的,只允許0,1類人參觀,其他人都不允許
--以上第2類人預定的,所以第3類跟6類人不兼容
--以上第3類人是要買珠寶的,所以第3類跟4,5,6類人都不兼容。
3.2 DDL鎖
當正在進行的DDL操作作用于或引用對象時,數據字典(DDL)鎖保護模式對象的定義。
在DDL操作期間,只有修改或引用的單個架構對象才會被鎖定。數據庫從不鎖定整個數據字典。
Oracle數據庫代表任何需要DDL鎖的DDL事務自動獲取DDL鎖。用戶不能顯式請求DDL鎖。例如,如果用戶創建了一個存儲過程,那么Oracle數據庫會自動為過程定義中引用的所有模式對象獲取DDL鎖。DDL鎖防止在過程編譯完成之前更改或刪除這些對象。
3.2.1 DDL排他鎖
排他DDL鎖阻止其他會話獲得DDL或DML鎖。
大多數DDL操作需要對一個資源使用獨占DDL鎖,以防止對其他DDL操作的破壞干擾,這些操作可能修改或引用相同的模式對象。例如,當ALTER TABLE添加一個列時,DROP TABLE不允許刪除一個表,反之亦然。
3.2.2 DDL共享鎖
資源的共享DDL鎖可以防止對沖突的DDL操作的破壞性干擾,但允許對類似的DDL操作進行數據并發。
這些鎖會保護所引用對象的結構,使之不會被其他會話修改,但是允許修改數據。
例如,在運行CREATE PROCEDURE語句時,包含的事務為所有引用的表獲取共享DDL鎖。其他事務可以并發地創建引用相同表的過程,并獲取相同表上的并發共享DDL鎖,但是任何事務都不能獲得任何引用表上的獨占DDL鎖。
共享DDL鎖在DDL語句執行和自動提交期間有效。因此,持有共享DDL鎖的事務可以保證引用的模式對象的定義在事務期間保持不變。
3.2.3 DDL可分解的解析鎖
一個解析鎖被稱為一個可分解的解析鎖,因為它不禁止任何DDL操作,并且可以被分解為允許沖突的DDL操作。
這些鎖允許一個對象(如共享池中緩存的一個查詢計劃)向另外某個對象注冊其依賴性。如果在被依賴的對象上執行DDL,Oracle會查看已經對該對象注冊了依賴性的對象列表,并使這些對象無效。因此,這些鎖是“可分解的”,它們不防止DDL出現。
3.3 系統鎖
Oracle數據庫使用各種類型的系統鎖來保護內部數據庫和內存結構。這些機制對于用戶來說是透明的。
3.3.1 閂鎖 Latches
閂鎖是一種簡單的低級序列化機制,用于協調對共享數據結構、對象和文件的多用戶訪問。
一般來說,latch由三種內存元素成:pid(進程id),內存地址和內存長度。Latch保證對共享數據結構的排它性訪問,以此來保證內存結構的完整性不受到損壞。在多個會話同時修改或者檢視(inspect)sga中同一個內存結構時,必須串行化訪問以 保證sga中數據結構的完整性,latch 不會造成阻塞,是只會等待。當前一個進程釋放latch后,如果其他多個進程同時請求的話,他們之間將出現競爭,沒有一個入隊機制,一旦前面進程釋放鎖定,后面的進程就蜂擁而上,沒有先來后到的概念,并且這一切都發生的非常快,因為Latch的特點是快而短暫。
latch 爭用多半要考慮系統及數據庫自身設計問題,如綁定變量,熱塊及參數設置是否合理。
如多用戶對主鍵的刪除或者修改,是否有用戶使用select… for update這樣的語法,外鍵是否創建索引等。
閂鎖保護共享內存資源在被多個進程訪問時不受損壞。具體來說,鎖存保護數據結構不受以下情況的影響:
?多個會話并發修改
?當被一個會話讀取的同時被另一個會話修改
?當訪問時釋放重新分配內存
通常,在SGA中單個閂保護多個對象,例如,后臺進程(例如DBWn和LGWR)從共享池(shared pool)分配內存創建數據結構,為了分配這些內存,這些進程用一個共享池閂來序列化訪問,防止兩個進程同時檢查或修改共享池。內存被分配后,其它進程可能需要訪問共享池,例如庫緩存(library cache),用于解析,這時,進程閂只鎖庫緩存,不鎖整個共享池。
與隊列鎖(如行鎖)不同,閂不允許session排隊。當一個閂鎖可用時,發起請求的第一個session獲取到閂。當一個進程在一個循環中重復地請求一個閂,叫做Latch spinning,而一個進程等待請求閂期間睡眠釋放CPU,則叫做latch sleeping。
通常,一個Oracle進程在操作或查看一個數據結構時只獲取閂極短的時間,例如,當處理一個雇員的薪水更新時,數據庫可以獲取和釋放幾千次鎖。閂的實現依賴于操作系統,特別是對于怎么處理閂的等待。
閂的增加意味著并行度的減少,例如,過多的硬操作會競爭庫緩存閂。V$LATCH視圖包含了每種閂使用的統計信息,包括請求和等待每個閂鎖的次數。
3.3.2 互斥鎖 Mutexes
Mutex作為Latch的替代品,具有更快速獲得,更小等優勢。
獲取一個mutex進需要大約30~35個指令, 而Latch則需要150~200個指令。一個mutex結構的大小大約為16 bytes,而在10.2版本中一個latch需要112個bytes,在更早的版本中是200個bytes。
互斥對象(互斥對象)是一種低級別的機制,它可以防止內存中的對象在被并發進程訪問時老化或損壞。互斥鎖類似于閂,但閂通常保護一組對象,而互斥鎖保護單個對象。
互斥鎖有幾個好處:
?互斥鎖可以減少爭用。
因為一個閂保護多個對象,所以當多個進程試圖同時訪問這些對象時,它可能成為瓶頸。通過序列化對單個對象而不是組的訪問,互斥鎖減速了競爭。
?互斥鎖消耗的內存比閂更少。
?在共享模式下,互斥鎖允許多個會話并發引用。
3.3.3 內部鎖 Internal Locks
內部鎖是比閂和互斥鎖更高級、更復雜的機制,可用于各種目的。
數據庫使用以下類型的內部鎖:
?字典緩存鎖
這些鎖的持續時間非常短,當字典緩存的條目被修改或使用時,它們保證被解析的語句不會看到不一致的對象定義。字典緩存鎖可以是共享的,也可以是獨占的。共享鎖在解析完成時釋放,而獨占鎖在DDL操作完成時釋放。
?文件和日志管理鎖
這些鎖保護各種文件。例如,一種內部鎖保護控制文件保證一次只有一個進程可以修改它。另一個鎖協調在線重做日志文件的使用和歸檔。數據文件被鎖定,以確保多個實例以共享模式掛載數據庫,或一個實例以獨占模式掛載數據庫。因為文件鎖和日志鎖指示文件的狀態,所以這些鎖必須保持很長時間。
?表空間和撤銷段鎖
這些鎖保護表空間和撤銷段。例如,訪問數據庫的所有實例必須就表空間是聯機還是脫機達成一致。undo段被鎖定,保證只有一個數據庫實例可以寫入undo。
“Oracle鎖的面試題有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。