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多粒度封鎖機制研究二(zt)Oracle
- Oracle中的for update 和 for update nowaitOracleAI
- Jtti:MySQL 資料庫中update語句會不會發生死鎖JttiMySql資料庫
- oracle資料庫事務transaction 不同的鎖lock型別Oracle資料庫型別
- oracle資料庫檢視鎖表的sql語句整理Oracle資料庫SQL
- Django 中的資料庫update() 和 save() 方法的機制的不同Django資料庫
- dg和ogg的區別--oracle資料庫Oracle資料庫
- 解鎖你的資料庫:JPA和Hibernate的樂觀鎖與悲觀鎖資料庫
- 資料庫兩大神器【索引和鎖】資料庫索引
- Oracle資料庫-----資料庫的基本概念Oracle資料庫
- oracle資料庫事務transaction鎖lock模式思考之一Oracle資料庫模式
- 資料庫的統計(select)確實會影響資料庫的更新(update)的資料庫
- 資料庫中的共享鎖與排他鎖資料庫
- 資料庫基礎知識詳解二:樂觀/悲觀鎖、封鎖級別、三級封鎖協議以及兩段鎖協議資料庫協議
- Oracle資料庫冷備和恢復Oracle資料庫
- 一文讀懂資料庫中的樂觀鎖和悲觀鎖和MVVC資料庫
- 「Oracle」Oracle 資料庫安裝Oracle資料庫
- oracle資料庫的impdp,expdpOracle資料庫
- oracle資料庫%notfound的理解Oracle資料庫
- 資料庫12.2.0.1新變化RU(Release Updates)和RUR(Release Update Revisions)資料庫
- Oracle資料庫配置Oracle資料庫
- 異構資料庫資料遷移 oracle to mysql之oracle sqlloader和mysql load data資料庫OracleMySql
- 資料庫鎖機制資料庫
- 【TUNE_ORACLE】Oracle資料庫與HugePages(二)HugePages配置和限制Oracle資料庫
- [轉]Oracle資料庫ASH和AWR的簡單介紹Oracle資料庫
- Struts2和Oracle資料庫互動的小DemoOracle資料庫
- Oracle資料庫歸檔模式的開啟和關閉Oracle資料庫模式
- For Update 加鎖分析
- oracle資料庫與oracle例項Oracle資料庫
- 「Oracle」Oracle資料庫基本概念Oracle資料庫
- 「Oracle」Oracle 資料庫基本概念Oracle資料庫
- 關於資料庫事務和鎖的一些分析資料庫
- 基於資料庫、redis和zookeeper實現的分散式鎖資料庫Redis分散式
- oracle 備份資料庫,匯出資料庫Oracle資料庫
- oracle資料庫--Oracle雙引號和單引號的區別小結Oracle資料庫
- 記錄一下MySql update會鎖定哪些範圍的資料MySql
- oracle rac資料庫的安裝Oracle資料庫
- oracle資料庫的配置檔案Oracle資料庫
- Oracle資料庫中遇到的坑Oracle資料庫