oracle如何加排它鎖 oracle共享鎖和排他鎖

Oracle中的鎖

這些是基礎(chǔ),必須掌握:鎖定的概念:鎖定是數(shù)據(jù)庫用來控制共享資源并發(fā)布訪問的機(jī)制。在多用戶環(huán)境下,多個(gè)用戶可同時(shí)訪問相同的數(shù)據(jù)。Oracle 提供鎖以確保在多用戶環(huán)境下數(shù)據(jù)的完整性和一致性。在提交或回滾事務(wù)之前,Oracle 會(huì)鎖定正被修改的數(shù)據(jù)。在用戶完成或回滾事務(wù)之后,鎖會(huì)自動(dòng)釋放。只有在提交或回滾事物之后,其他用戶才可以更新這些數(shù)據(jù)。鎖的兩種級(jí)別為:行級(jí)鎖和表級(jí)鎖。行級(jí)鎖主要用于特定的行,表級(jí)鎖主要用于整個(gè)表,下面我就行級(jí)鎖和表級(jí)鎖來個(gè)說明:行級(jí)鎖行級(jí)鎖只對(duì)用戶正在訪問的行進(jìn)行鎖定。如果該用戶正在修改某行,那么其他用戶就可以更新同一表中該行之外的數(shù)據(jù)。例如:如果用戶1正在更新Jobs 表中的第一行,則用戶2可以同時(shí)修改該表中的第二行。也就是說除了該表中的第一行,其他用戶可以修改任意行,但是第一行的數(shù)據(jù)其他用戶只能select。行級(jí)鎖是一種排他鎖,防止其他事務(wù)修改此行,但是不會(huì)阻止讀取此行的操作。在使用INSERT、UPDATE、DELETE 和SELECT…FOR UPDATE 等 語句時(shí),Oracle 會(huì)自動(dòng)應(yīng)用行級(jí)鎖鎖定。SELECT...FOR UPDATE 語句允許用戶每次選擇多行記錄進(jìn)行更新,這些記錄會(huì)被鎖定,且只能由發(fā)起查詢的用戶進(jìn)行編輯。只有在回滾或提交事務(wù)之后,鎖定才會(huì)釋放,其他用戶才可以編輯這些記錄。SELECT...FOR UPDATE 語句的語法如下: SELECT ... FOR UPDATE [OF column_list][WAIT n|NOWAIT];其中:OF 子句用于指定即將更新的列,即鎖定行上的特定列。WAIT 子句指定等待其他用戶釋放鎖的秒數(shù),防止無限期的等待?!笆褂肍OR UPDATE WAIT”子句的優(yōu)點(diǎn)如下:⒈防止無限期地等待被鎖定的行;⒉允許應(yīng)用程序中對(duì)鎖的等待時(shí)間進(jìn)行更多的控制。⒊對(duì)于交互式應(yīng)用程序非常有用,因?yàn)檫@些用戶不能等待不確定舉例:比如一個(gè)用戶在SQL PLUS下輸入這條語句:SQLSELECT * FROM order_master WHERE vencode='V002' FOR UPDATE;此時(shí)再開啟一個(gè)SQL PLUS,以相同的用戶登陸,執(zhí)行下面的命令。SQL SELECT * FROM order_master WHERE vencode='V02' FOR UPDATE WAIT 5;由于要更新的行已經(jīng)被鎖定,上述命令在等待5秒鐘之后返回,并給出如下的錯(cuò)誤信息:ERROR 位于第1行;ORA-30006;資源已被占用;執(zhí)行操作時(shí)出現(xiàn)WAIT超時(shí)。PS:再開啟的SQL PLUS 是以相同用戶登陸的,用其他用戶登陸更是不可能。表級(jí)鎖表級(jí)鎖被鎖定的表,暫時(shí)放在內(nèi)存中,不提交不進(jìn)去數(shù)據(jù)庫,也就是說,多個(gè)用戶在同一時(shí)間,同時(shí)修改同一個(gè)表的同一行時(shí),同時(shí)點(diǎn)提交,但是還是按隨機(jī)的先后被提交進(jìn)數(shù)據(jù)庫,而不是同時(shí)被提交,而是先隨機(jī)存儲(chǔ)后,被再次提交的覆蓋。表級(jí)鎖將保護(hù)表數(shù)據(jù),在事務(wù)處理過程中,表級(jí)鎖會(huì)限制對(duì)整個(gè)表的訪問??梢允褂肔OCK TABLE 語句顯示地鎖定表。表級(jí)鎖用來限制對(duì)表執(zhí)行添加、更新和刪除等修改操作。鎖定表的語法如下:LOCK TABLE table_name IN lock_mode MODE [NOWAIT];其中:lock_mode 是鎖定的模式。NOWAIT 關(guān)鍵字用于防止無限期的等待其他用戶釋放鎖。表級(jí)鎖的模式包括以下內(nèi)容:行共享 (ROW SHARE, RS): 允許其他用戶訪問和鎖定該表,但是禁止排他鎖定整個(gè)表。行共享鎖鎖定后,在同一時(shí)刻,不同用戶可以對(duì)同一個(gè)表中的被行共享鎖鎖定后的該行,具備增、刪、改、查的功能。行排他(ROW EXCLUSIVE, RX):與行共享模式相同,同時(shí)禁止其他用戶在此表上使用共享鎖。使用SELECT...FOR UPDATE 語句會(huì)在表上自動(dòng)應(yīng)用排他鎖。被行排他后,其他用戶不能同時(shí)修改該行,但是可以插入行,可以查詢該行,其他用戶也不能再在該表上對(duì)此行進(jìn)行排他。共享(SHARE, S):共享鎖將鎖定表,僅允許其他用戶查詢表中的行,但不允許插入、更新或刪除行。多個(gè)用戶可以同時(shí)在同一個(gè)表中放置共享鎖,即允許資源共享,因此得名“共享鎖”。例如,如果用戶每天都需要在結(jié)帳時(shí)更新日銷售表,則可以在更改該表時(shí)使用共享鎖以確保數(shù)據(jù)的一致性。也就是說該表只能查,其他用戶想修改表中行的數(shù)據(jù),只需要對(duì)該表進(jìn)行共享鎖。共享行排他(SHARE ROW EXCLUSIVE , SPX):執(zhí)行比共享表更多的限制。防止其他事務(wù)在表上應(yīng)用共享鎖、共享行排他鎖以及排他鎖。共享行排他是除了該行以外的其他行也不能增、刪、改。只能在此表中加低級(jí)表。要是想在該表中更改其他行的數(shù)據(jù),就只有其他用戶對(duì)該行進(jìn)行共享行排他鎖,也僅僅只能修改被這個(gè)用戶鎖定的行,而其他的行也修改不了。排他(EXCLUSIVE,E):對(duì)表執(zhí)行最大限制。除了允許其他用戶查詢該表的記錄,排他鎖防止其他事務(wù)對(duì)表做任何更改或在表上應(yīng)用任何類型的鎖。這個(gè)鎖應(yīng)該叫鎖中之王,他鎖住了的話,其他用戶就只有查詢的功能了,就別想在該表中干別的事了。BTW:在能加很多鎖的表中,如果第一個(gè)用戶對(duì)該表鎖定時(shí),沒有使用“NOWAIT”語句,是需要第一個(gè)用戶對(duì)該表COMMIT或ROLLBACK 命令釋放鎖定后,其他用戶才能對(duì)該表進(jìn)行鎖定。如果其他用戶違反了該條,就會(huì)無期限的等待。。。。SQL LOCK TABLE order_mater IN SHARE MODE;而使用下面的語句就可以很少的預(yù)防這種情況的存在:SQL LOCK TBALE order_mater IN SHARE MODE NOWAIT;這是些擴(kuò)展的內(nèi)容,供大家參考

員工經(jīng)過長期磨合與沉淀,具備了協(xié)作精神,得以通過團(tuán)隊(duì)的力量開發(fā)出優(yōu)質(zhì)的產(chǎn)品。成都創(chuàng)新互聯(lián)公司堅(jiān)持“專注、創(chuàng)新、易用”的產(chǎn)品理念,因?yàn)椤皩W⑺詫I(yè)、創(chuàng)新互聯(lián)網(wǎng)站所以易用所以簡單”。公司專注于為企業(yè)提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、微信公眾號(hào)開發(fā)、電商網(wǎng)站開發(fā),小程序設(shè)計(jì),軟件按需定制等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。

1 引言—數(shù)據(jù)庫鎖的基本概念 為了確保并發(fā)用戶在存取同一數(shù)據(jù)庫對(duì)象時(shí)的正確性(即無丟失修改、可重復(fù)讀、不讀“臟”數(shù)據(jù)),數(shù)據(jù)庫中引入了鎖機(jī)制?;镜逆i類型有兩種:排它鎖(Exclusive locks記為X鎖)和共享鎖(Share locks記為S鎖)。 排它鎖:若事務(wù)T對(duì)數(shù)據(jù)D加X鎖,則其它任何事務(wù)都不能再對(duì)D加任何類型的鎖,直至T釋放D上的X鎖;一般要求在修改數(shù)據(jù)前要向該數(shù)據(jù)加排它鎖,所以排它鎖又稱為寫鎖。 共享鎖:若事務(wù)T對(duì)數(shù)據(jù)D加S鎖,則其它事務(wù)只能對(duì)D加S鎖,而不能加X鎖,直至T釋放D上的S鎖;一般要求在讀取數(shù)據(jù)前要向該數(shù)據(jù)加共享鎖,所以共享鎖又稱為讀鎖。 2 Oracle 多粒度封鎖機(jī)制介紹 根據(jù)保護(hù)對(duì)象的不同,Oracle數(shù)據(jù)庫鎖可以分為以下幾大類: (1) DML lock(data locks,數(shù)據(jù)鎖):用于保護(hù)數(shù)據(jù)的完整性; (2) DDL lock(dictionary locks,字典鎖):用于保護(hù)數(shù)據(jù)庫對(duì)象的結(jié)構(gòu)(例如表、視圖、索引的結(jié)構(gòu)定義); (3) internal locks 和l a t c h es(內(nèi)部鎖與閂):保護(hù)內(nèi)部數(shù)據(jù)庫結(jié)構(gòu); (4) distributed locks(分布式鎖):用于OPS(并行服務(wù)器)中; (5) PCM locks(并行高速緩存管理鎖):用于OPS(并行服務(wù)器)中。 本文主要討論DML(也可稱為data locks,數(shù)據(jù)鎖)鎖。從封鎖粒度(封鎖對(duì)象的大小)的角度看,Oracle DML鎖共有兩個(gè)層次,即行級(jí)鎖和表級(jí)鎖。 2.1 Oracle的TX鎖(行級(jí)鎖、事務(wù)鎖) 許多對(duì)Oracle不太了解的技術(shù)人員可能會(huì)以為每一個(gè)TX鎖代表一條被封鎖的數(shù)據(jù)行,其實(shí)不然。TX的本義是Transaction(事務(wù)),當(dāng)一個(gè)事務(wù)第一次執(zhí)行數(shù)據(jù)更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE語句進(jìn)行查詢時(shí),它即獲得一個(gè)TX(事務(wù))鎖,直至該事務(wù)結(jié)束(執(zhí)行COMMIT或ROLLBACK操作)時(shí),該鎖才被釋放。所以,一個(gè)TX鎖,可以對(duì)應(yīng)多個(gè)被該事務(wù)鎖定的數(shù)據(jù)行。 在Oracle的每行數(shù)據(jù)上,都有一個(gè)標(biāo)志位來表示該行數(shù)據(jù)是否被鎖定。Oracle不象其它一些DBMS(數(shù)據(jù)庫管理系統(tǒng))那樣,建立一個(gè)鏈表來維護(hù)每一行被加鎖的數(shù)據(jù),這樣就大大減小了行級(jí)鎖的維護(hù)開銷,也在很大程度上避免了其它數(shù)據(jù)庫系統(tǒng)使用行級(jí)封鎖時(shí)經(jīng)常發(fā)生的鎖數(shù)量不夠的情況。數(shù)據(jù)行上的鎖標(biāo)志一旦被置位,就表明該行數(shù)據(jù)被加X鎖,Oracle在數(shù)據(jù)行上沒有S鎖。

2.2 TM鎖(表級(jí)鎖) 2.2.1 意向鎖的引出 表是由行組成的,當(dāng)我們向某個(gè)表加鎖時(shí),一方面需要檢查該鎖的申請是否與原有的表級(jí)鎖相容;另一方面,還要檢查該鎖是否與表中的每一行上的鎖相容。比如一個(gè)事務(wù)要在一個(gè)表上加S鎖,如果表中的一行已被另外的事務(wù)加了X鎖,那么該鎖的申請也應(yīng)被阻塞。如果表中的數(shù)據(jù)很多,逐行檢查鎖標(biāo)志的開銷將很大,系統(tǒng)的性能將會(huì)受到影響。為了解決這個(gè)問題,可以在表級(jí)引入新的鎖類型來表示其所屬行的加鎖情況,這就引出了“意向鎖”的概念。 意向鎖的含義是如果對(duì)一個(gè)結(jié)點(diǎn)加意向鎖,則說明該結(jié)點(diǎn)的下層結(jié)點(diǎn)正在被加鎖;對(duì)任一結(jié)點(diǎn)加鎖時(shí),必須先對(duì)它的上層結(jié)點(diǎn)加意向鎖。如:對(duì)表中的任一行加鎖時(shí),必須先對(duì)它所在的表加意向鎖,然后再對(duì)該行加鎖。這樣一來,事務(wù)對(duì)表加鎖時(shí),就不再需要檢查表中每行記錄的鎖標(biāo)志位了,系統(tǒng)效率得以大大提高。 2.2.2 意向鎖的類型 由兩種基本的鎖類型(S鎖、X鎖),可以自然地派生出兩種意向鎖: 意向共享鎖(Intent Share Lock,簡稱IS鎖):如果要對(duì)一個(gè)數(shù)據(jù)庫對(duì)象加S鎖,首先要對(duì)其上級(jí)結(jié)點(diǎn)加IS鎖,表示它的后裔結(jié)點(diǎn)擬(意向)加S鎖; 意向排它鎖(Intent Exclusive Lock,簡稱IX鎖):如果要對(duì)一個(gè)數(shù)據(jù)庫對(duì)象加X鎖,首先要對(duì)其上級(jí)結(jié)點(diǎn)加IX鎖,表示它的后裔結(jié)點(diǎn)擬(意向)加X鎖。 另外,基本的鎖類型(S、X)與意向鎖類型(IS、IX)之間還可以組合出新的鎖類型,理論上可以組合出4種,即:S+IS,S+IX,X+IS,X+IX,但稍加分析不難看出,實(shí)際上只有S+IX有新的意義,其它三種組合都沒有使鎖的強(qiáng)度得到提高(即:S+IS=S,X+IS=X,X+IX=X,這里的“=”指鎖的強(qiáng)度相同)。所謂鎖的強(qiáng)度是指對(duì)其它鎖的排斥程度。 這樣我們又可以引入一種新的鎖的類型。 共享意向排它鎖(Shared Intent Exclusive Lock,簡稱SIX鎖) :如果對(duì)一個(gè)數(shù)據(jù)庫對(duì)象加SIX鎖,表示對(duì)它加S鎖,再加IX鎖,即SIX=S+IX。例如:事務(wù)對(duì)某個(gè)表加SIX鎖,則表示該事務(wù)要讀整個(gè)表(所以要對(duì)該表加S鎖),同時(shí)會(huì)更新個(gè)別行(所以要對(duì)該表加IX鎖)。 這樣數(shù)據(jù)庫對(duì)象上所加的鎖類型就可能有5種:即S、X、IS、IX、SIX。 具有意向鎖的多粒度封鎖方法中任意事務(wù)T要對(duì)一個(gè)數(shù)據(jù)庫對(duì)象加鎖,必須先對(duì)它的上層結(jié)點(diǎn)加意向鎖。申請封鎖時(shí)應(yīng)按自上而下的次序進(jìn)行;釋放封鎖時(shí)則應(yīng)按自下而上的次序進(jìn)行;具有意向鎖的多粒度封鎖方法提高了系統(tǒng)的并發(fā)度,減少了加鎖和解鎖的開銷。 2.2.3 Oracle的TM鎖(表級(jí)鎖) Oracle的DML鎖(數(shù)據(jù)鎖)正是采用了上面提到的多粒度封鎖方法,其行級(jí)鎖雖然只有一種(即X鎖),但其TM鎖(表級(jí)鎖)類型共有5種,分別稱為共享鎖(S鎖)、排它鎖(X鎖)、行級(jí)共享鎖(RS鎖)、行級(jí)排它鎖(RX鎖)、共享行級(jí)排它鎖(SRX鎖),與上面提到的S、X、IS、IX、SIX相對(duì)應(yīng)。需要注意的是,由于Oracle在行級(jí)只提供X鎖,所以與RS鎖(通過SELECT … FOR UPDATE語句獲得)對(duì)應(yīng)的行級(jí)鎖也是X鎖(但是該行數(shù)據(jù)實(shí)際上還沒有被修改),這與理論上的IS鎖是有區(qū)別的。 下表為Oracle數(shù)據(jù)庫TM鎖的相容矩陣(Y=Yes,表示相容的請求; N=No,表示不相容的請求;-表示沒有加鎖請求):

T2

T1 S X RS RX SRX -

----------------------------------------------------

S Y N Y N N Y

X N N N N N Y

RS Y N Y Y Y Y

RX N N Y Y N Y

SRX N N Y N N Y

- Y Y Y Y Y Y

表一:Oracle數(shù)據(jù)庫TM鎖的相容矩陣 一方面,當(dāng)Oracle執(zhí)行SELECT…FOR UPDATE、INSERT、UPDATE、DELETE等DML語句時(shí),系統(tǒng)自動(dòng)在所要操作的表上申請表級(jí)RS鎖(SELECT…FOR UPDATE)或RX鎖(INSERT、UPDATE、DELETE),當(dāng)表級(jí)鎖獲得后,系統(tǒng)再自動(dòng)申請TX鎖,并將實(shí)際鎖定的數(shù)據(jù)行的鎖標(biāo)志位置位(指向該TX鎖);另一方面,程序或操作人員也可以通過LOCK TABLE語句來指定獲得某種類型的TM鎖。下表總結(jié)了Oracle中各SQL語句產(chǎn)生TM鎖的情況: SQL語句 表鎖模式 允許的鎖模式

-------------------------------------------------------------------------------------------------

Select * from table_name…… 無 RS、RX、S、SRX、X

Insert into table_name…… RX RS、RX

Update table_name…… RX RS、RX

Delete from table_name…… RX RS、RX

Select * from table_name for update RS RS、RX、S、SRX

lock table table_name in row share mode RS RS、RX、S、SRX

lock table table_name in row exclusive mode RX RS、RX

lock table table_name in share mode S RS、S

lock table table_name in share row exclusive mode SRX RS

lock table table_name in exclusive mode X 無

java實(shí)現(xiàn)oracle數(shù)據(jù)庫寫鎖

ConnectOracle con = new ConnectOracle();

Connection connect = con.getConnection();

// 設(shè)置手動(dòng)提交事務(wù)

connect.setAutoCommit(false);

Statement stmt = connect.createStatement();

// 鎖表

stmt.addBatch("lock table t_symbol_code_fee in exclusive mode");

// 此處打上斷點(diǎn)后,執(zhí)行另一個(gè)類,你會(huì)發(fā)現(xiàn),執(zhí)行成功后并沒有更改記錄,因?yàn)楸硪呀?jīng)被鎖定。只有提交事務(wù)后,TestOracle中執(zhí)行的修改才能生效。

stmt.executeBatch();

// 提交后自動(dòng)解鎖,回滾時(shí)也會(huì)自動(dòng)解鎖

connect.commit();

stmt.close();

connect.close();

關(guān)于Oracle數(shù)據(jù)庫鎖的問題,表鎖,行鎖,共享和排他的問題,跪求大神解答

半專業(yè)回答:

1, 這是個(gè)疑問句嗎

2,如果只是 讀操作是不會(huì)加鎖的

3,事務(wù)2 什么操作都不行

4,事務(wù)2 可以加共享鎖,不能加排他鎖

問題補(bǔ)充回答

讀操作就是select ,任何時(shí)刻都可以,因?yàn)槭欠亲枞x,由UNDO機(jī)制實(shí)現(xiàn)

共享鎖是保證表結(jié)構(gòu)不能被更改,但是可以更改沒有加排他鎖的數(shù)據(jù)

共享鎖是表級(jí)的,排他鎖是行級(jí)的

oracle行級(jí)鎖和表級(jí)鎖的區(qū)別?

區(qū)別:

1、表級(jí)鎖,一般是指表結(jié)構(gòu)共享鎖鎖,是不可對(duì)該表執(zhí)行DDL操作,但對(duì)DML操作都不限制。?行級(jí)鎖之前需要先加表結(jié)構(gòu)共享鎖。鎖定整個(gè)表,限制對(duì)于其他用戶對(duì)表的訪問。

2、行級(jí)鎖,一般是指排它鎖,即被鎖定行不可進(jìn)行修改,刪除,只可以被其他會(huì)話select。行級(jí)鎖之前需要先加表結(jié)構(gòu)共享鎖。對(duì)目前被修改的行進(jìn)行鎖定,其它用戶可訪問被鎖定的行以外的行。

基本說明:

1、行級(jí)鎖是MySQL中鎖定粒度最細(xì)的一種鎖,表示只針對(duì)當(dāng)前操作的行進(jìn)行加鎖。行級(jí)鎖能大大減少數(shù)據(jù)庫操作的沖突,其加鎖粒度最小,但加鎖的開銷也最大。行級(jí)鎖分為共享鎖和排他鎖。開銷大,加鎖慢;會(huì)出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率低,并發(fā)度高;

2、表級(jí)鎖是MySQL中鎖定粒度最大的一種鎖,表示對(duì)當(dāng)前操作的整張表加鎖,它實(shí)現(xiàn)簡單,資源消耗較少,被大部分MySQL引擎支持。最常使用的MyISAM與InnoDB都支持表級(jí)鎖定。表級(jí)鎖定分為表共享讀鎖與表獨(dú)占寫鎖。不會(huì)出現(xiàn)死鎖;鎖定粒度大,發(fā)出鎖沖突的概率最高,并發(fā)度最低。

oracle TM lock 模式中排他鎖的應(yīng)用例子

數(shù)據(jù)庫是一個(gè)多用戶使用的共享資源。當(dāng)多個(gè)用戶并發(fā)地存取數(shù)據(jù)時(shí),在數(shù)據(jù)庫中就會(huì)產(chǎn)生多個(gè)事務(wù)同時(shí)存取同一數(shù)據(jù)的情況。若對(duì)并發(fā)操作不加控制就可能會(huì)讀取和存儲(chǔ)不正確的數(shù)據(jù),破壞數(shù)據(jù)庫的一致性。

加鎖是實(shí)現(xiàn)數(shù)據(jù)庫并發(fā)控制的一個(gè)非常重要的技術(shù)。當(dāng)事務(wù)在對(duì)某個(gè)數(shù)據(jù)對(duì)象進(jìn)行操作前,先向系統(tǒng)發(fā)出請求,對(duì)其加鎖。加鎖后事務(wù)就對(duì)該數(shù)據(jù)對(duì)象有了一定的控制,在該事務(wù)釋放鎖之前,其他的事務(wù)不能對(duì)此數(shù)據(jù)對(duì)象進(jìn)行更新操作。

在數(shù)據(jù)庫中有兩種基本的鎖類型:排它鎖(Exclusive Locks,即X鎖)和共享鎖(Share Locks,即S鎖)。當(dāng)數(shù)據(jù)對(duì)象被加上排它鎖時(shí),其他的事務(wù)不能對(duì)它讀取和修改。加了共享鎖的數(shù)據(jù)對(duì)象可以被其他事務(wù)讀取,但不能修改。數(shù)據(jù)庫利用這兩種基本的鎖類型來對(duì)數(shù)據(jù)庫的事務(wù)進(jìn)行并發(fā)控制。

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

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

DDL鎖(dictionary locks,字典鎖),用于保護(hù)數(shù)據(jù)庫對(duì)象的結(jié)構(gòu),如表、索引等的結(jié)構(gòu)定義;

內(nèi)部鎖和閂(internal locks and latches),保護(hù)數(shù)據(jù)庫的內(nèi)部結(jié)構(gòu),應(yīng)用于SGA;

在我們實(shí)際應(yīng)用開發(fā)中涉及較多的是DML鎖,其他兩種的話DBA會(huì)更加關(guān)心點(diǎn);

DML鎖的目的在于保證并發(fā)情況下的數(shù)據(jù)完整性,主要包括TM鎖和TX鎖,其中TM鎖稱為表級(jí)鎖,TX鎖稱為事務(wù)鎖或行級(jí)鎖。

當(dāng)Oracle執(zhí)行DML語句時(shí),系統(tǒng)自動(dòng)在所要操作的表上申請TM類型的鎖。當(dāng)TM鎖獲得后,系統(tǒng)再自動(dòng)申請TX類型的鎖,并將實(shí)際鎖定的數(shù)據(jù)行的鎖標(biāo)志位進(jìn)行置位。這樣在事務(wù)加鎖前檢查TX鎖相容性時(shí)就不用再逐行檢查鎖標(biāo)志,而只需檢查TM鎖模式的相容性即可,大大提高了系統(tǒng)的效率。TM鎖包括了SS、SX、S、X等多種模式,在數(shù)據(jù)庫中用0-6來表示。不同的SQL操作產(chǎn)生不同類型的TM鎖。如下圖所示:

值 鎖模式 鎖描述 SQL

0 NONE

1 NULL 空 SELECT

2 SS(ROW-S) 行級(jí)共享鎖

其他對(duì)象只能查詢這些數(shù)據(jù)行 SELECT FOR UPDATE、LOCK FOR UPDATE、

LOCK ROW SHARE

3 SX(ROW-X) 行級(jí)排它鎖

在提交前不允許做DML操作 INSERT、UPDATE、DELETE、

LOCK ROW SHARE

4 S(SHARE) 共享鎖 CREATE INDEX、LOCK SHARE

5 SSX(S/ROW-X) 共享行級(jí)排它鎖 LOCK SHARE ROW EXCLUSIVE

6 X(eXclusive) 排它鎖 ALTER TABLE、DROP TABLE、DROP INDEX、

TRUNCATE TABLE、LOCK EXCLUSIVE

在數(shù)據(jù)行上只有X鎖(排他鎖)。在 Oracle數(shù)據(jù)庫中,當(dāng)一個(gè)事務(wù)首次發(fā)起一個(gè)DML語句時(shí)就獲得一個(gè)TX鎖,該鎖保持到事務(wù)被提交或回滾。當(dāng)兩個(gè)或多個(gè)會(huì)話在表的同一條記錄上執(zhí)行 DML語句時(shí),第一個(gè)會(huì)話在該條記錄上加鎖,其他的會(huì)話處于等待狀態(tài)。當(dāng)?shù)谝粋€(gè)會(huì)話提交后,TX鎖被釋放,其他會(huì)話才可以加鎖。

在大概了解oracle的鎖機(jī)制之后,我們來解決幾個(gè)基本的問題:

1.UPDATE/DELETE操作會(huì)將RS鎖定,直至操作被COMMIT或者ROLLBACK;

若操作未COMMIT之前其他session對(duì)同樣的RS做變更操作,則操作會(huì)被hold,直至前session的UPDATE/DELETE操作被COMMIT;

2.session內(nèi)外SELECT的RS范圍

前提:INSERT、UPDATE操作未COMMIT之前進(jìn)行SELECT;

若在同一session內(nèi),SELECT出來的RS會(huì)包括之前INSERT、UPDATE影響的記錄;

若不在同一session內(nèi),SELECT出來的RS不會(huì)包括未被COMMIT的記錄;

3.SELECT.... FOR UPDATE [OF cols] [NOWAIT/WAIT] [SKIP LOCKED]

OF cols:只鎖定指定字段所在表的RS,而沒有指定的表則不會(huì)鎖定,只會(huì)在多表聯(lián)合查詢時(shí)出現(xiàn);

NOWAIT:語句不會(huì)hold,而是直接返回錯(cuò)誤ORA-00054: resource busy and acquire with NOWAIT specified;

WAIT N:語句被hold N秒,之后返回錯(cuò)誤ORA-30006: resource busy; acquire with WAIT timeout expired;

SKIP LOCKED:不提示錯(cuò)誤,而是直接返回no rows selected;

以上幾個(gè)選項(xiàng)可以聯(lián)合使用的,比較推薦的有:

SELECT.... FOR UPDATE NOWAIT:對(duì)同一RS執(zhí)行該SQL時(shí),直接返回錯(cuò)誤;

SELECT.... FOR UPDATE NOWAIT SKIP LOCKED:對(duì)同一RS執(zhí)行該SQL時(shí),直接返回空行;

PS:當(dāng)RS被LOCK住之后,只對(duì)同樣請求LOCK的語句有效,對(duì)無需LOCK的SELECT語句并沒有任何影響;

如何在oracle中使用排他鎖

個(gè)人理解:

排他分為,樂觀排他

悲觀排他,就是樂觀鎖和悲觀鎖的意思,

樂觀與悲觀針對(duì)的是數(shù)據(jù)庫而言,

樂觀排他后,別人也能進(jìn)行數(shù)據(jù)修改,但是當(dāng)你提交時(shí)候發(fā)現(xiàn)數(shù)據(jù)被修改了就會(huì)報(bào)錯(cuò)。

悲觀排他后,別人是動(dòng)不了這些數(shù)據(jù)的。

共享鎖不甚了解

當(dāng)前標(biāo)題:oracle如何加排它鎖 oracle共享鎖和排他鎖
網(wǎng)頁路徑:http://muchs.cn/article26/hjdccg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、服務(wù)器托管、用戶體驗(yàn)自適應(yīng)網(wǎng)站、靜態(tài)網(wǎng)站、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)