語法:事務
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鎖住而沒有查出來。