for update和for update nowait的區別和使用


首先,for update 和for update nowait 是對操作的數據行進行加鎖,在事務提交前防止其他操作對數據的修改。

for update 和for update nowait主要區別在於是否等待,如果不加nowait,在執行select時就會報錯,如果加了nowait,在執行select時就會等待,直至鎖被釋放。

首先我們使用兩個sql:

1.select * from HH t where id='1' for update

2.select * from HH t where id ='1' for  update nowait

sql1在pl/sql中執行,sql2在ob12中執行(在pl/sql或ob12中開兩個窗口執行不行,現在我也不知道為什么):

執行sql1后查詢出正確信息,在執行sql2,出現錯誤信息“ORA-00054: 資源正忙, 但指定以 NOWAIT 方式獲取資源, 或者超時失效”。這是因為執行sql1時對改行的數據加了鎖,其他操作是不能訪問改行的。當我們在sql1后執行commit后,sql2就能顯示正確的數據。

將sql2換成for  update 按上面得步驟執行,sql2會一直等待鎖得釋放不會,直至sql1后commit,sql2就能查詢出數據;

這里還有 for  update wait n (n是時間,單位:秒),即會等待n秒,n秒之后數據還是鎖住的話就會報上面提到的錯誤;

其實for update 就是為了防止在查詢數據的時候對數據進行修改,比如有以下兩個sql:

sql1:select * from HH t where id='1' for update

sql2:update HH set name='張三' where id = '1'

當我們執行sql1后,在執行sql2,sql2就會一直等待sql1將鎖釋放后才能執行,這樣在查詢的時候就不會出行數據改變,在sql1后執行commit,sql2就會自動執行了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM