程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> for update和for update nowait的區別和使用,updatenowait

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

編輯:Oracle教程

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


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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved