首先,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就會自動執行了。