Oracle的TX鎖(行級鎖、事務鎖)

問題:如何使用事務? 
回答:一共有三步。 
一、先開啓事務。 
•在Oracle中,事務是在上一次事務結束之後,數據「第一次」被修改時自動開啓。 
•在java中,設置鏈接爲手動提交模式開始。代碼: 
connection.setAutoCommit(false)。
 
二、進行(屢次)數據操做(增刪改)…… 
三、結束事務: commit、rollback。 
問題:如何結束事務? 
回答: 
有兩種方法: 
一、確認對數據的修改:提交,commit。 
二、撤消對數據的修改:回滾,rollback。 
另外,當Oracle系統或者PL/SQL腳本拋出異常,都會形成數據回滾。 

問題:什麼是提交模式,與事務有什麼關係? 
回答: 
提交模式有兩種: 
自動提交:在每一次數據被修改之後,自動提交。這種模式下是沒法支持事務的。 
手動提交:全部的數據修改都在內存中,當執行commit時才一塊兒提交。只要有一條sql執行失敗,則全部的sql自動回滾。只能在手動提交模式下才能使用事務。
 


3.1 Oracle的TX鎖(行級鎖、事務鎖) 
許多對Oracle不太瞭解的技術人員可能會覺得每個TX鎖表明一條被封鎖的數據行,其實否則。TX的本義是Transaction(事務),當一個事務第一次執行數據更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE語句進行查詢時,它即得到一個TX(事務)鎖,直至該事務結束(執行COMMIT或ROLLBACK操做)時,該鎖才被釋放。因此,一個TX鎖,能夠對應多個被該事務鎖定的數據行(在咱們用的時候可能是啓動一個事務,而後SELECT… FOR UPDATE NOWAIT)。  
在Oracle的每行數據上,都有一個標誌位來表示該行數據是否被鎖定。Oracle不像DB2那樣,創建一個鏈表來維護每一行被加鎖的數據,這樣就大大減少了行級鎖的維護開銷,也在很大程度上避免了相似DB2使用行級鎖時常常發生的鎖數量不夠而進行鎖升級的狀況。數據行上的鎖標誌一旦被置位,就代表該行數據被加X鎖,Oracle在數據行上沒有S鎖。 
3.2 TM鎖(表級鎖) 
3.2.1 意向鎖的引出 
表是由行組成的,當咱們向某個表加鎖時,一方面須要檢查該鎖的申請是否與原有的表級鎖相容;另外一方面,還要檢查該鎖是否與表中的每一行上的鎖相容。好比一個事務要在一個表上加S鎖,若是表中的一行已被另外的事務加了X鎖,那麼該鎖的申請也應被阻塞。若是表中的數據不少,逐行檢查鎖標誌的開銷將很大,系統的性能將會受到影響。爲了解決這個問題,能夠在表級引入新的鎖類型來表示其所屬行的加鎖狀況,這就引出了"意向鎖"的概念。 
意向鎖的含義是若是對一個結點加意向鎖,則說明該結點的下層結點正在被加鎖;對任一結點加鎖時,必須先對它的上層結點加意向鎖。如:對錶中的任一行加鎖時,必須先對它所在的表加意向鎖,而後再對該行加鎖。這樣一來,事務對錶加鎖時,就再也不須要檢查表中每行記錄的鎖標誌位了,系統效率得以大大提升。 
3.2.2 意向鎖的類型 
由兩種基本的鎖類型(S鎖、X鎖),能夠天然地派生出兩種意向鎖: 
意向共享鎖(Intent Share Lock,簡稱IS鎖):若是要對一個數據庫對象加S鎖,首先要對其上級結點加IS鎖,表示它的後裔結點擬(意向)加S鎖; 
意向排它鎖(Intent Exclusive Lock,簡稱IX鎖):若是要對一個數據庫對象加X鎖,首先要對其上級結點加IX鎖,表示它的後裔結點擬(意向)加X鎖。 
另外,基本的鎖類型(S、X)與意向鎖類型(IS、IX)之間還能夠組合出新的鎖類型,理論上能夠組合出4種,即:S+IS,S+IX,X+IS,X+IX,但稍加分析不難看出,實際上只有S+IX有新的意義,其它三種組合都沒有使鎖的強度獲得提升(即:S+IS=S,X+IS=X,X+IX=X,這裏的"="指鎖的強度相同)。所謂鎖的強度是指對其它鎖的排斥程度。 
這樣咱們又能夠引入一種新的鎖的類型: 
共享意向排它鎖(Shared Intent Exclusive Lock,簡稱SIX鎖):若是對一個數據庫對象加SIX鎖,表示對它加S鎖,再加IX鎖,即SIX=S+IX。例如:事務對某個表加SIX鎖,則表示該事務要讀整個表(因此要對該表加S鎖),同時會更新個別行(因此要對該表加IX鎖)。 
這樣數據庫對象上所加的鎖類型就可能有5種:即S、X、IS、IX、SIX。 
具備意向鎖的多粒度封鎖方法中任意事務T要對一個數據庫對象加鎖,必須先對它的上層結點加意向鎖。申請封鎖時應按自上而下的次序進行;釋放封鎖時則應按自下而上的次序進行;具備意向鎖的多粒度封鎖方法提升了系統的併發度,減小了加鎖和解鎖的開銷。 
3.3 Oracle的TM鎖(表級鎖) 
Oracle的DML鎖(數據鎖)正是採用了上面提到的多粒度封鎖方法,其行級鎖雖然只有一種(即X鎖),但其TM鎖(表級鎖)類型共有5種,分別稱爲共享鎖(S鎖)、排它鎖(X鎖)、行級共享鎖(RS鎖)、行級排它鎖(RX鎖)、共享行級排它鎖(SRX鎖),與上面提到的S、X、IS、IX、SIX相對應。須要注意的是,因爲Oracle在行級只提供X鎖,因此與RS鎖(經過SELECT … FOR UPDATE語句得到)對應的行級鎖也是X鎖(可是該行數據實際上尚未被修改),這與理論上的IS鎖是有區別的。 鎖的兼容性是指當一個應用程序在表(行)上加上某種鎖後,其餘應用程序是否可以在表(行)上加上相應的鎖,若是可以加上,說明這兩種鎖是兼容的,不然說明這兩種鎖不兼容,不能對同一數據對象併發存取。 
下表爲Oracle數據庫TM鎖的兼容矩陣(Y=Yes,表示兼容的請求; N=No,表示不兼容的請求;-表示沒有加鎖請求): 

表五:Oracle數據庫TM鎖的相容矩陣


一方面,當Oracle執行SELECT…FOR UPDATE、INSERT、UPDATE、DELETE等DML語句時,系統自動在所要操做的表上申請表級RS鎖(SELECT…FOR UPDATE)或RX鎖(INSERT、UPDATE、DELETE),當表級鎖得到後,系統再自動申請TX鎖,並將實際鎖定的數據行的鎖標誌位置位(指向該TX鎖);另外一方面,程序或操做人員也能夠經過LOCK TABLE語句來指定得到某種類型的TM鎖。下表是筆者總結了Oracle中各SQL語句產生TM鎖的狀況: 
表六:Oracle數據庫TM鎖小結
 


咱們能夠看到,一般的DML操做(SELECT…FOR UPDATE、INSERT、UPDATE、DELETE),在表級得到的只是意向鎖(RS或RX),其真正的封鎖粒度仍是在行級;另外,Oracle數據庫的一個顯著特色是,在缺省狀況下,單純地讀數據(SELECT)並不加鎖,Oracle經過回滾段(Rollback segment)來保證用戶不讀"髒"數據。這些都提升了系統的併發程度。   
因爲意向鎖及數據行上鎖標誌位的引入,減少了Oracle維護行級鎖的開銷,這些技術的應用使Oracle可以高效地處理高度併發的事務請求。
相關文章
相關標籤/搜索