Oracle中select ... for update的用法
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中立馬顯示出正常結果
把視窗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鎖住而沒有查出來。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29485627/viewspace-1291675/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle中select for update ...一些區別Oracle
- DataTable中的select()用法
- Oracle中的for update 和 for update nowaitOracleAI
- select for update
- 淺談Golang中select的用法Golang
- AngularJS select中ngOptions用法詳解AngularJSGo
- MySQL中SELECT+UPDATE併發更新問題MySql
- 深入理解SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE
- sql查詢更新update selectSQL
- oracle樹中prior的用法Oracle
- Sql server with as update用法SQLServer
- select into from 和 insert into select 的用法和區別
- mysql update join,insert select 語法MySql
- oracle中的CURRVAL和NEXTVAL用法Oracle
- oracle中substr() instr() 用法Oracle
- SQLite語句(二):INSERT DELETE UPDATE SELECTSQLitedelete
- Oracle table selectOracle
- Oracle中 Update和insert結合語法Oracle
- DBeaver如何生成select,update,delete,insert語句delete
- Django model update的各種用法介紹Django
- 由select for update鎖等待問題引發的深入思考
- oracle comment on的用法Oracle
- Django model select的各種用法詳解Django
- 非空校驗在oracle和mysql中的用法OracleMySql
- 記一次 MySQL select for update 死鎖問題MySql
- oracle update left join查詢Oracle
- Oracle Critical Patch Update for October 2022Oracle
- ORACLE SEQUENCE用法Oracle
- channel的單向用法與select,range簡單使用
- java-Mybatis XML 對映器(select,insert, update 和 delete)JavaMyBatisXMLdelete
- 【Oracle的NVL函式用法】Oracle函式
- 如何讓oracle的select強制走索引Oracle索引
- MybatisPlus中的update操作MyBatis
- Oracle中Nextval用法SEQUENCE與SYS_GUID()OracleGUI
- ORACLE多表關聯UPDATE語句Oracle
- SQLite中的SELECT子句SQLite
- ORACLE SELECT INTO NO_DATA_FOUND問題Oracle
- mssql sqlserver update delete表別名用法簡介SQLServerdelete
- oracle中listagg()和wmsys.wm_concat()基本用法Oracle