Oracle數據庫:for update 和for update of

select * from TTable1 for update 鎖定表的所有行,只能讀不能寫
 
2  select * from TTable1 where pkid = 1 for update 只鎖定pkid=1的行

3  select * from Table1 a join Table2 b on a.pkid=b.pkid for update 鎖定兩個表的所有記錄
 
4 select * from Table1 a join Table2 b on a.pkid=b.pkid where a.pkid = 10 for update 鎖定兩個表的中滿足條件的行

5. select * from Table1 a join Table2 b on a.pkid=b.pkid where a.pkid = 10 for update of a.pkid 只鎖定Table1中滿足條件的行
 
for update 是把所有的表都鎖點 for update of 根據of 後表的條件鎖定相對應的表 
-----------
關於NOWAIT(如果一定要用FOR UPDATE,我更建議加上NOWAIT)
當有LOCK衝突時會提示錯誤並結束STATEMENT而不是在那裏等待(比如:要查的行已經被其它事務鎖了,當前的鎖事務與之衝突,加上nowait,當前的事務會結束會提示錯誤並立即結束 STATEMENT而不再等待).

如果加了for update後 該語句用來鎖定特定的行(如果有where子句,就是滿足where條件的那些行)。當這些行被鎖定後,其他會話可以選擇這些行,但不能更改或刪除這些行,直到該語句的事務被commit語句或rollback語句結束爲止。

因爲FOR   UPDATE子句獲得了鎖,所以COMMIT將釋放這些鎖。當鎖釋放了,該遊標就無效了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章