select *from 表名 where rownum = 行號 for update;
成都創(chuàng)新互聯(lián)公司專注于瑪曲企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,電子商務(wù)商城網(wǎng)站建設(shè)?,斍W(wǎng)站建設(shè)公司,為瑪曲等地區(qū)提供建站服務(wù)。全流程按需開發(fā),專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
這樣寫試一下,看看是否好用。
如果當(dāng)前有用戶在對某行數(shù)據(jù)進(jìn)行修改登操作,oracle會在這行數(shù)據(jù)上添加行級鎖,期間,所有用戶對該行數(shù)據(jù)只能查詢,不可修改,如果比如說執(zhí)行update操作,需等待該修改操作事務(wù)提交或者回滾之后,才行。
oracle數(shù)據(jù)庫分行級鎖和表級鎖。用select * from table-name for update完成行級鎖。用delete或update完成表級鎖。你鎖定的資源 別人會等待你的提交語句或回退語句完成以后再繼續(xù)進(jìn)行。
這些是基礎(chǔ),必須掌握:鎖定的概念:鎖定是數(shù)據(jù)庫用來控制共享資源并發(fā)布訪問的機制。在多用戶環(huán)境下,多個用戶可同時訪問相同的數(shù)據(jù)。Oracle 提供鎖以確保在多用戶環(huán)境下數(shù)據(jù)的完整性和一致性。在提交或回滾事務(wù)之前,Oracle 會鎖定正被修改的數(shù)據(jù)。在用戶完成或回滾事務(wù)之后,鎖會自動釋放。只有在提交或回滾事物之后,其他用戶才可以更新這些數(shù)據(jù)。鎖的兩種級別為:行級鎖和表級鎖。行級鎖主要用于特定的行,表級鎖主要用于整個表,下面我就行級鎖和表級鎖來個說明:行級鎖行級鎖只對用戶正在訪問的行進(jìn)行鎖定。如果該用戶正在修改某行,那么其他用戶就可以更新同一表中該行之外的數(shù)據(jù)。例如:如果用戶1正在更新Jobs 表中的第一行,則用戶2可以同時修改該表中的第二行。也就是說除了該表中的第一行,其他用戶可以修改任意行,但是第一行的數(shù)據(jù)其他用戶只能select。行級鎖是一種排他鎖,防止其他事務(wù)修改此行,但是不會阻止讀取此行的操作。在使用INSERT、UPDATE、DELETE 和SELECT…FOR UPDATE 等 語句時,Oracle 會自動應(yīng)用行級鎖鎖定。SELECT...FOR UPDATE 語句允許用戶每次選擇多行記錄進(jìn)行更新,這些記錄會被鎖定,且只能由發(fā)起查詢的用戶進(jìn)行編輯。只有在回滾或提交事務(wù)之后,鎖定才會釋放,其他用戶才可以編輯這些記錄。SELECT...FOR UPDATE 語句的語法如下: SELECT ... FOR UPDATE [OF column_list][WAIT n|NOWAIT];其中:OF 子句用于指定即將更新的列,即鎖定行上的特定列。WAIT 子句指定等待其他用戶釋放鎖的秒數(shù),防止無限期的等待?!笆褂肍OR UPDATE WAIT”子句的優(yōu)點如下:⒈防止無限期地等待被鎖定的行;⒉允許應(yīng)用程序中對鎖的等待時間進(jìn)行更多的控制。⒊對于交互式應(yīng)用程序非常有用,因為這些用戶不能等待不確定舉例:比如一個用戶在SQL PLUS下輸入這條語句:SQLSELECT * FROM order_master WHERE vencode='V002' FOR UPDATE;此時再開啟一個SQL PLUS,以相同的用戶登陸,執(zhí)行下面的命令。SQL SELECT * FROM order_master WHERE vencode='V02' FOR UPDATE WAIT 5;由于要更新的行已經(jīng)被鎖定,上述命令在等待5秒鐘之后返回,并給出如下的錯誤信息:ERROR 位于第1行;ORA-30006;資源已被占用;執(zhí)行操作時出現(xiàn)WAIT超時。PS:再開啟的SQL PLUS 是以相同用戶登陸的,用其他用戶登陸更是不可能。表級鎖表級鎖被鎖定的表,暫時放在內(nèi)存中,不提交不進(jìn)去數(shù)據(jù)庫,也就是說,多個用戶在同一時間,同時修改同一個表的同一行時,同時點提交,但是還是按隨機的先后被提交進(jìn)數(shù)據(jù)庫,而不是同時被提交,而是先隨機存儲后,被再次提交的覆蓋。表級鎖將保護(hù)表數(shù)據(jù),在事務(wù)處理過程中,表級鎖會限制對整個表的訪問??梢允褂肔OCK TABLE 語句顯示地鎖定表。表級鎖用來限制對表執(zhí)行添加、更新和刪除等修改操作。鎖定表的語法如下:LOCK TABLE table_name IN lock_mode MODE [NOWAIT];其中:lock_mode 是鎖定的模式。NOWAIT 關(guān)鍵字用于防止無限期的等待其他用戶釋放鎖。表級鎖的模式包括以下內(nèi)容:行共享 (ROW SHARE, RS): 允許其他用戶訪問和鎖定該表,但是禁止排他鎖定整個表。行共享鎖鎖定后,在同一時刻,不同用戶可以對同一個表中的被行共享鎖鎖定后的該行,具備增、刪、改、查的功能。行排他(ROW EXCLUSIVE, RX):與行共享模式相同,同時禁止其他用戶在此表上使用共享鎖。使用SELECT...FOR UPDATE 語句會在表上自動應(yīng)用排他鎖。被行排他后,其他用戶不能同時修改該行,但是可以插入行,可以查詢該行,其他用戶也不能再在該表上對此行進(jìn)行排他。共享(SHARE, S):共享鎖將鎖定表,僅允許其他用戶查詢表中的行,但不允許插入、更新或刪除行。多個用戶可以同時在同一個表中放置共享鎖,即允許資源共享,因此得名“共享鎖”。例如,如果用戶每天都需要在結(jié)帳時更新日銷售表,則可以在更改該表時使用共享鎖以確保數(shù)據(jù)的一致性。也就是說該表只能查,其他用戶想修改表中行的數(shù)據(jù),只需要對該表進(jìn)行共享鎖。共享行排他(SHARE ROW EXCLUSIVE , SPX):執(zhí)行比共享表更多的限制。防止其他事務(wù)在表上應(yīng)用共享鎖、共享行排他鎖以及排他鎖。共享行排他是除了該行以外的其他行也不能增、刪、改。只能在此表中加低級表。要是想在該表中更改其他行的數(shù)據(jù),就只有其他用戶對該行進(jìn)行共享行排他鎖,也僅僅只能修改被這個用戶鎖定的行,而其他的行也修改不了。排他(EXCLUSIVE,E):對表執(zhí)行最大限制。除了允許其他用戶查詢該表的記錄,排他鎖防止其他事務(wù)對表做任何更改或在表上應(yīng)用任何類型的鎖。這個鎖應(yīng)該叫鎖中之王,他鎖住了的話,其他用戶就只有查詢的功能了,就別想在該表中干別的事了。BTW:在能加很多鎖的表中,如果第一個用戶對該表鎖定時,沒有使用“NOWAIT”語句,是需要第一個用戶對該表COMMIT或ROLLBACK 命令釋放鎖定后,其他用戶才能對該表進(jìn)行鎖定。如果其他用戶違反了該條,就會無期限的等待。。。。SQL LOCK TABLE order_mater IN SHARE MODE;而使用下面的語句就可以很少的預(yù)防這種情況的存在:SQL LOCK TBALE order_mater IN SHARE MODE NOWAIT;這是些擴展的內(nèi)容,供大家參考
1 引言—數(shù)據(jù)庫鎖的基本概念 為了確保并發(fā)用戶在存取同一數(shù)據(jù)庫對象時的正確性(即無丟失修改、可重復(fù)讀、不讀“臟”數(shù)據(jù)),數(shù)據(jù)庫中引入了鎖機制?;镜逆i類型有兩種:排它鎖(Exclusive locks記為X鎖)和共享鎖(Share locks記為S鎖)。 排它鎖:若事務(wù)T對數(shù)據(jù)D加X鎖,則其它任何事務(wù)都不能再對D加任何類型的鎖,直至T釋放D上的X鎖;一般要求在修改數(shù)據(jù)前要向該數(shù)據(jù)加排它鎖,所以排它鎖又稱為寫鎖。 共享鎖:若事務(wù)T對數(shù)據(jù)D加S鎖,則其它事務(wù)只能對D加S鎖,而不能加X鎖,直至T釋放D上的S鎖;一般要求在讀取數(shù)據(jù)前要向該數(shù)據(jù)加共享鎖,所以共享鎖又稱為讀鎖。 2 Oracle 多粒度封鎖機制介紹 根據(jù)保護(hù)對象的不同,Oracle數(shù)據(jù)庫鎖可以分為以下幾大類: (1) DML lock(data locks,數(shù)據(jù)鎖):用于保護(hù)數(shù)據(jù)的完整性; (2) DDL lock(dictionary locks,字典鎖):用于保護(hù)數(shù)據(jù)庫對象的結(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ù)鎖)鎖。從封鎖粒度(封鎖對象的大?。┑慕嵌瓤?,Oracle DML鎖共有兩個層次,即行級鎖和表級鎖。 2.1 Oracle的TX鎖(行級鎖、事務(wù)鎖) 許多對Oracle不太了解的技術(shù)人員可能會以為每一個TX鎖代表一條被封鎖的數(shù)據(jù)行,其實不然。TX的本義是Transaction(事務(wù)),當(dāng)一個事務(wù)第一次執(zhí)行數(shù)據(jù)更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE語句進(jìn)行查詢時,它即獲得一個TX(事務(wù))鎖,直至該事務(wù)結(jié)束(執(zhí)行COMMIT或ROLLBACK操作)時,該鎖才被釋放。所以,一個TX鎖,可以對應(yīng)多個被該事務(wù)鎖定的數(shù)據(jù)行。 在Oracle的每行數(shù)據(jù)上,都有一個標(biāo)志位來表示該行數(shù)據(jù)是否被鎖定。Oracle不象其它一些DBMS(數(shù)據(jù)庫管理系統(tǒng))那樣,建立一個鏈表來維護(hù)每一行被加鎖的數(shù)據(jù),這樣就大大減小了行級鎖的維護(hù)開銷,也在很大程度上避免了其它數(shù)據(jù)庫系統(tǒng)使用行級封鎖時經(jīng)常發(fā)生的鎖數(shù)量不夠的情況。數(shù)據(jù)行上的鎖標(biāo)志一旦被置位,就表明該行數(shù)據(jù)被加X鎖,Oracle在數(shù)據(jù)行上沒有S鎖。
2.2 TM鎖(表級鎖) 2.2.1 意向鎖的引出 表是由行組成的,當(dāng)我們向某個表加鎖時,一方面需要檢查該鎖的申請是否與原有的表級鎖相容;另一方面,還要檢查該鎖是否與表中的每一行上的鎖相容。比如一個事務(wù)要在一個表上加S鎖,如果表中的一行已被另外的事務(wù)加了X鎖,那么該鎖的申請也應(yīng)被阻塞。如果表中的數(shù)據(jù)很多,逐行檢查鎖標(biāo)志的開銷將很大,系統(tǒng)的性能將會受到影響。為了解決這個問題,可以在表級引入新的鎖類型來表示其所屬行的加鎖情況,這就引出了“意向鎖”的概念。 意向鎖的含義是如果對一個結(jié)點加意向鎖,則說明該結(jié)點的下層結(jié)點正在被加鎖;對任一結(jié)點加鎖時,必須先對它的上層結(jié)點加意向鎖。如:對表中的任一行加鎖時,必須先對它所在的表加意向鎖,然后再對該行加鎖。這樣一來,事務(wù)對表加鎖時,就不再需要檢查表中每行記錄的鎖標(biāo)志位了,系統(tǒng)效率得以大大提高。 2.2.2 意向鎖的類型 由兩種基本的鎖類型(S鎖、X鎖),可以自然地派生出兩種意向鎖: 意向共享鎖(Intent Share Lock,簡稱IS鎖):如果要對一個數(shù)據(jù)庫對象加S鎖,首先要對其上級結(jié)點加IS鎖,表示它的后裔結(jié)點擬(意向)加S鎖; 意向排它鎖(Intent Exclusive Lock,簡稱IX鎖):如果要對一個數(shù)據(jù)庫對象加X鎖,首先要對其上級結(jié)點加IX鎖,表示它的后裔結(jié)點擬(意向)加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鎖) :如果對一個數(shù)據(jù)庫對象加SIX鎖,表示對它加S鎖,再加IX鎖,即SIX=S+IX。例如:事務(wù)對某個表加SIX鎖,則表示該事務(wù)要讀整個表(所以要對該表加S鎖),同時會更新個別行(所以要對該表加IX鎖)。 這樣數(shù)據(jù)庫對象上所加的鎖類型就可能有5種:即S、X、IS、IX、SIX。 具有意向鎖的多粒度封鎖方法中任意事務(wù)T要對一個數(shù)據(jù)庫對象加鎖,必須先對它的上層結(jié)點加意向鎖。申請封鎖時應(yīng)按自上而下的次序進(jìn)行;釋放封鎖時則應(yīng)按自下而上的次序進(jìn)行;具有意向鎖的多粒度封鎖方法提高了系統(tǒng)的并發(fā)度,減少了加鎖和解鎖的開銷。 2.2.3 Oracle的TM鎖(表級鎖) Oracle的DML鎖(數(shù)據(jù)鎖)正是采用了上面提到的多粒度封鎖方法,其行級鎖雖然只有一種(即X鎖),但其TM鎖(表級鎖)類型共有5種,分別稱為共享鎖(S鎖)、排它鎖(X鎖)、行級共享鎖(RS鎖)、行級排它鎖(RX鎖)、共享行級排它鎖(SRX鎖),與上面提到的S、X、IS、IX、SIX相對應(yīng)。需要注意的是,由于Oracle在行級只提供X鎖,所以與RS鎖(通過SELECT … FOR UPDATE語句獲得)對應(yīng)的行級鎖也是X鎖(但是該行數(shù)據(jù)實際上還沒有被修改),這與理論上的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語句時,系統(tǒng)自動在所要操作的表上申請表級RS鎖(SELECT…FOR UPDATE)或RX鎖(INSERT、UPDATE、DELETE),當(dāng)表級鎖獲得后,系統(tǒng)再自動申請TX鎖,并將實際鎖定的數(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 無
半專業(yè)回答:
1,
這是個疑問句嗎
2,如果只是
讀操作是不會加鎖的
3,事務(wù)2
什么操作都不行
4,事務(wù)2
可以加共享鎖,不能加排他鎖
問題補充回答
讀操作就是select
,任何時刻都可以,因為是非阻塞讀,由undo機制實現(xiàn)
共享鎖是保證表結(jié)構(gòu)不能被更改,但是可以更改沒有加排他鎖的數(shù)據(jù)
共享鎖是表級的,排他鎖是行級的
1、在sql語句后面加上for update可以獲得行鎖。
2、捕捉返回的sqlcode 和 sqlerrmc 可以得到返回值和錯誤信息。
---
以上,希望對你有所幫助。