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 updateOracle
- Oracle中select for update ...一些區別Oracle
- DataTable中的select()用法
- oracle connection,select,update 工作原理Oracle
- select for update
- select for update nowait 與 select for update 區別AI
- 淺談Golang中select的用法Golang
- Oracle中的for update 和 for update nowaitOracleAI
- oracle中update的細節Oracle
- ORACLE CASE WHEN 及 SELECT CASE WHEN的用法Oracle
- SELECT ... FOR UPDATE SKIP LOCKED;
- 如何插入insert_update,delete_select特殊字元&到oracle表中delete字元Oracle
- Oracle中with的用法Oracle
- MySQL中SELECT+UPDATE併發更新問題MySql
- 關於 select ... for update 和 for update nowaitAI
- 使用select監視update的操作
- select for update nowaitAI
- SQL update select語句SQL
- Sql server with as update用法SQLServer
- AngularJS select中ngOptions用法詳解AngularJSGo
- UPDATE SET = (SELECT ) 語法的總結
- 【 Oracle中rownum的用法 】Oracle
- Oracle 中 case的用法Oracle
- sql查詢更新update selectSQL
- Default Locking for INSERT, UPDATE, DELETE, and SELECT ... FOR UPDATE (351)delete
- Oracle資料庫封鎖和select...[for update [of tab.col]]的研究Oracle資料庫
- 深入理解SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE
- 【Mysql】兩條select for update引起的死鎖MySql
- 【MySQL】select for update 的Row Lock 與Table LockMySql
- sql語句中select……as的用法SQL
- oracle樹中prior的用法Oracle
- Oracle中rowid的用法Oracle
- 【oracle中rowid的用法】Oracle
- oracle中copy from的用法Oracle
- MysqL_select for update鎖詳解MySql
- select for update與autocommit關係MIT
- Select Top在不同資料庫中的使用用法資料庫
- oracle中top用法Oracle