Oracle資料庫封鎖和select...[for update [of tab.col]]的研究

rainlover發表於2010-10-04

今天早上上班發現有人在CSDN上提出了關於Oracle select...for update of 的問題,頁面如下:http://community.csdn.net/Expert/topic/5490/5490597.xml?temp=.9783289

經過研究對比,發現規則,總結如下:

表封鎖查詢對比 Table For Update For Update of A.Id
A 1.有where條件時,鎖定條件中指定的資料行(行級封鎖);
2.無where條件是,鎖定表A(表級封鎖)。
 1.有where條件時,鎖定條件中指定的資料行(行級封鎖);
2.無where條件是,鎖定表A(表級封鎖)。
 
A,B 直接封鎖A,B表(表級封鎖) 1.有where條件時,封鎖where條件中滿足條件的A表的資料行(行級封鎖),B表不鎖定;
2.無where條件是,鎖定A表(表級鎖),B表不鎖定。
 

通過對上表的對比,發現對於單表來說For Update和For Update of效果一樣,只有在多表查詢時產生差異,這個差異在於For Update of使使用者能夠鎖定多表中的指定表或表的資料行。對於在討論中提到的鎖定For Update of A.Id是否指明鎖定欄位的問題,我覺得不可能,因為Oracle資料庫中的鎖機制中支援到行級,不可能到欄位級。至於為什麼要這樣表達,估計是將其用於索引的目的,確切目的請高手賜教!

以上功能的相關應用:

現有資料庫開發過程中對事務的控制、事務鎖、行鎖、表鎖的發現缺乏必要的方法和手段,通過以下手段可以豐富我們處理開發過程中處理鎖問題的方法。
For Update和For Update of使使用者能夠鎖定指定表或表的資料行這個功能在實際應用中具有很重要的意義,特別對於多使用者多執行緒處理中如要先獲取資料通過判斷在去更新資料(這中間不允許資料發生變化)的時候這個SQL功能是唯一最佳的選擇。
此外,為了解決因為For Update而引起的死鎖問題,Oracle提供了select...[for update [of tab.col]] [nowait]功能,這個功能使得在執行select...for update前先檢查所申請的行、表資源是否可用,如果可用則加寫鎖,否則直接返回Ora-54錯誤。這個功能也用很好的應用價值,在多執行緒中判斷資源的可用性方面將發揮作用。


本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/annicybc/archive/2007/04/30/1592737.aspx

 

(1)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將釋放這些鎖。當鎖釋放了,該遊標就無效了。

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/11320622/viewspace-675432/,如需轉載,請註明出處,否則將追究法律責任。

相關文章