ORACLEforupdate和forupdatenowait的區(qū)別?
for update 和 for update nowait 的區(qū)別:首先一點(diǎn),如果只是select 的話,Oracle是不會(huì)加任何鎖的,也就是Oracle對(duì) select 讀到的數(shù)據(jù)不會(huì)有任何限制,雖然這時(shí)候有可能另外一個(gè)進(jìn)程正在修改表中的數(shù)據(jù),并且修改的結(jié)果可能影響到你目前select語句的結(jié)果,但是因?yàn)闆]有鎖,所以select結(jié)果為當(dāng)前時(shí)刻表中記錄的狀態(tài)。
如果加入了for update, 則Oracle一旦發(fā)現(xiàn)(符合查詢條件的)這批數(shù)據(jù)正在被修改,則不會(huì)發(fā)出該select語句查詢,直到數(shù)據(jù)被修改結(jié)束(被commit),馬上自動(dòng)執(zhí)行這個(gè)select語句。
同樣,如果該查詢語句發(fā)出后,有人需要修改這批數(shù)據(jù)(中的一條或幾條),它也必須等到查詢結(jié)束后(commit)后,才能修改。for update nowait和 for update 都會(huì)對(duì)所查詢到得結(jié)果集進(jìn)行加鎖,所不同的是,如果另外一個(gè)線程正在修改結(jié)果集中的數(shù)據(jù),for update nowait 不會(huì)進(jìn)行資源等待,只要發(fā)現(xiàn)結(jié)果集中有些數(shù)據(jù)被加鎖,立刻返回 “ORA-00054錯(cuò)誤,內(nèi)容是資源正忙, 但指定以 NOWAIT 方式獲取資源”。for update 和 for update nowait 加上的是一個(gè)行級(jí)鎖,也就是只有符合where條件的數(shù)據(jù)被加鎖。
如果僅僅用update語句來更改數(shù)據(jù)時(shí),可能會(huì)因?yàn)榧硬簧湘i而沒有響應(yīng)地、莫名其妙地等待,但如果在此之前,for update NOWAIT語句將要更改的數(shù)據(jù)試探性地加鎖,就可以通過立即返回的錯(cuò)誤提示而明白其中的道理,或許這就是For Update和NOWAIT的意義之所在。
經(jīng)過測試,以for update 或 for update nowait方式進(jìn)行查詢加鎖,在select的結(jié)果集中,只要有任何一個(gè)記錄在加鎖,則整個(gè)結(jié)果集都在等待系統(tǒng)資源(如果是nowait,則拋出相應(yīng)的異常)