Oracle資料庫封鎖和select...[for update [of tab.col]]的研究
今天早上上班發現有人在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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- (轉)資料庫oracle for update of和for update區別資料庫Oracle
- oracle 資料庫的鎖Oracle資料庫
- [轉]介紹了Oracle資料庫鎖的種類及研究Oracle資料庫
- Oracle多粒度封鎖機制研究2Oracle
- Oracle多粒度封鎖機制研究1Oracle
- Oracle多粒度封鎖機制研究(zt)Oracle
- Oracle多粒度封鎖機制研究二(zt)Oracle
- 轉載oracle資料庫鎖Oracle資料庫
- ORACLE 資料庫中的鎖機制Oracle資料庫
- 解決Oracle資料庫死鎖Oracle資料庫
- 資料庫中的悲觀鎖和樂觀鎖資料庫
- Oracle資料庫中Insert、Update、Delete操作速度Oracle資料庫delete
- Oracle資料庫資料鎖機制解析(zt)Oracle資料庫
- 資料庫無法update資料庫
- update引起資料庫阻塞資料庫
- oracle封鎖測試Oracle
- Oracle中的for update 和 for update nowaitOracleAI
- Jtti:MySQL 資料庫中update語句會不會發生死鎖JttiMySql資料庫
- 【資料庫——鎖】資料庫
- 資料庫兩大神器【索引和鎖】資料庫索引
- standby資料庫的研究!資料庫
- 更新、插入資料庫所使用的UPDATE() (轉)資料庫
- Oracle___專題研究__資料庫壞塊Oracle資料庫
- 資料庫基礎知識詳解二:樂觀/悲觀鎖、封鎖級別、三級封鎖協議以及兩段鎖協議資料庫協議
- 解鎖你的資料庫:JPA和Hibernate的樂觀鎖與悲觀鎖資料庫
- excel表的資料update到oracle裡面ExcelOracle
- Oracle例項和Oracle資料庫Oracle資料庫
- Oracle\MS SQL Server的資料庫多表關聯更新UPDATE與多表更新OracleSQLServer資料庫
- 資料庫的升級和打補丁的研究資料庫
- 探索Oracle之資料庫升級九 12.1.0.1 Update 12.1.0.2Oracle資料庫
- ORACLE 9i資料庫優化案例(4) --- 索引改善UPDATEOracle資料庫優化索引
- 資料庫中的共享鎖與排他鎖資料庫
- oracle資料庫事務transaction 不同的鎖lock型別Oracle資料庫型別
- 怎樣快速查出Oracle 資料庫中的鎖等待Oracle資料庫
- oracle鎖機制研究Oracle
- Oracle資料庫的備份及恢復策略研究(轉)Oracle資料庫
- 一文讀懂資料庫中的樂觀鎖和悲觀鎖和MVVC資料庫
- RAID 和Oracle資料庫AIOracle資料庫