Oracle中的select for update 用法(轉)


通常情況下,select語句是不會對數據加鎖,不會妨礙影響其他的DMLDDL操作。借助for update子句,我們可以在應用程序的層面手工實現數據加鎖保護操作。當只允許一個session進行update的時候, for update十分有用.

select…for update之后,可以使用of子句選擇對select的特定數據表進行加鎖操作。默認情況下,不使用of子句表示在select所有的數據表中加鎖。

 

select * from test for update; 會對table test進行加鎖. 此時只允許當前的session對已經存在的數據進行更新. 但其它session仍可以進行insert的操作.

 

select * from Table1 a join Table2 b on a.pkid=b.pkid where a.pkid = 10 for update of a.pkid 只鎖定Table1中滿足條件的行, 這就是使用of子句的作用. 比較常用於多個表的操作.

 

加入for update之后,Oracle就要求啟動一個新事務,嘗試對數據進行加鎖。如果當前已經被加鎖,默認的行為必然是block等待。使用nowait子句的作用就是避免進行等待,當發現請求加鎖資源被鎖定未釋放的時候,直接報錯返回。如果不使用nowait或wait子句, 新的加鎖請求會一直hang住, 直到原來的commit或rollback.

 

 

select * from test where a=2 for update nowait;
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

 

或者
select * from test where a=2 for update wait 3; 如果3秒內還是無法加鎖則返回錯誤.

 

在一個session內可以多次進行select XX for update,然后只需要commit或rollback一次即可釋放.

 

轉自:http://blog.chinaunix.net/uid-23622436-id-3310223.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM