Oracle中select ... for update的用法

zhenghaishu發表於2014-10-08

Oracle中select ... for update的用法

 

語法:

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

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

使用“FOR UPDATE WAIT”子句的優點如下:

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

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

3對於互動式應用程式非常有用,因為這些使用者不能等待不確定

4若使用了skip locked,則可以越過鎖定的行,不會報告由wait n引發的資源忙異常報告

 

實驗:

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

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中立馬顯示出正常結果

 

把視窗12中未提交的事務都提交,以便進行下一步的實驗。

 

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;

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

把視窗12中未提交的事務都提交,以便進行下一步的實驗。

 

3

在視窗1中執行:

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

結果如下:


 

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

結果如下:


可見前三條資料因被視窗1鎖住而沒有查出來。

 

 

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

相關文章