Oracle中select ... for update的用法

語法:事務

SELECT ... FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED];ip

其中OF 子句用於指定即將更新的列,即鎖定行上的特定列; WAIT 子句指定等待其餘用戶釋放鎖的秒數,防止無限期的等待。資源

使用「FOR UPDATE WAIT」子句的優勢以下:it

1防止無限期地等待被鎖定的行;table

2容許應用程序中對鎖的等待時間進行更多的控制。date

3對於交互式應用程序很是有用,由於這些用戶不能等待不肯定select

4若使用了skip locked,則能夠越過鎖定的行,不會報告由wait n引起的‘資源忙’異常報告語法

 

實驗:程序

create table t(a varchar2(20),b varchar2(20));im

insert into t values('1','1');

insert into t values('2','2');

insert into t values('3','3');

insert into t values('4','4');

insert into t values('5','5');

insert into t values('6','6');

 

(1)在PLSQL Developer中打開兩個窗口,在窗口1中執行

select * from t where a='1' for update;

結果以下

 

 

在窗口2中執行

select * from t where a='1';

結果以下

 

可見此時能正常查詢。

 

在窗口2中執行

select * from t where a='1' for update;

發現沒法查詢出結果且PLSQL Developer的執行按鈕一直爲灰色。

這是由於表被窗口1裏的語句鎖住了,窗口2處於等待狀態。

只有等窗口1中提交了事務以後才能在窗口2中正常執行上述語句。

在窗口1中點擊提交事務的按鈕後,窗口2中立馬顯示出正常結果

 

把窗口1和2中未提交的事務都提交,以便進行下一步的實驗。

 

(2)

在窗口1中執行select * from t where a='1' for update;

在窗口2中執行select * from t where a='1' for update nowait;

立馬報資源正忙的錯誤:

關掉上面的錯誤提示窗口,在窗口2中執行

select * from t where a='1' for update wait 6;

則6秒以後報錯:

 

 

關掉上面的錯誤提示,在窗口2中執行

select * from t where a='1' for update skip locked;

則既不等待,也不報錯,也查詢不出結果:

把窗口1和2中未提交的事務都提交,以便進行下一步的實驗。

 

(3)

在窗口1中執行:

select * from t where rownum<=3 for update skip locked;

結果以下:

 

 

在窗口2中執行: 
select * from t where rownum<=6 for update skip locked;

結果以下:

 

可見前三條數據因被窗口1鎖住而沒有查出來。

相關文章
相關標籤/搜索