oracle for update 和 for update nowait 的區別
最新學訊:近期OCP認證正在報名中,因考試人員較多請盡快報名獲取最近考試時間,報名費用請聯系在線老師,甲骨文官方認證,報名從速!
我要咨詢for update 和 for update nowait 的區別
如果在select語句后加入了for update, 則Oracle一旦發現(符合查詢條件的)這批數據正在被修改,則不會發出該select語句查詢,直到數據被修改結束(被commit),馬上自動執行這個select語句。
同樣,如果該查詢語句發出后,有人需要修改這批數據(中的一條或幾條),它也必須等到查詢結束后(commit)后,才能修改。
for update nowait和 for update 都會對所查詢到得結果集進行加鎖,所不同的是,如果另外一個線程正在修改結果集中的數據,for update nowait 不會進行資源等待,只要發現結果集中有些數據被加鎖,立刻返回 “ORA-00054錯誤,內容是資源正忙, 但指定以 NOWAIT 方式獲取資源”。
for update 和 for update nowait 加上的是一個行級鎖,也就是只有符合where條件的數據被加鎖。如果僅僅用update語句來更改數據時,可能會因為加不上鎖而沒有響應地、莫名其妙地等待,但如果在此之前,for update NOWAIT語句將要更改的數據試探性地加鎖,就可以通過立即返回的錯誤提示而明白其中的道理,或許這就是For Update和NOWAIT的意義之所在。
for update 和 for update nowait如果對應的select語句有where條件時,只會鎖住對應的where條件下的數據,而不會鎖住整張表中的所有數據。
在編寫程序中,如果涉及到對表進行update,一定要對該表進行鎖定,否則將出現死鎖情況。
example:
當執行如下語句未進行commit時:SELECT * FROM cux_test t WHERE t.process_status = 'PENDING' FOR UPDATE NOWAIT;
同時再執行對應的如下程序,會報資源正忙的錯誤.
這里需要注意的是for update和for update nowait語句在同一session中只要使用一次就能鎖住對應表的對應記錄直到該session結束,意思是在一個session中如果對一張表update多次時只要進行一次lock的檢查。