oracle 的for update行鎖語法

2021-05-22 14:04:35 字數 1623 閱讀 4537

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'); 

現在執行如下操作: 

在plsql develope中開啟兩個sql視窗, 

在1視窗中執行sql 

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

在2視窗中執行sql1 

1. select * from t where a='1'; 這一點問題也沒有,因為行級鎖不會影響純粹的select語句 

再執行sql2 

2. select * from t where a='1' for update; 則這一句sql在執行時,永遠處於等待狀態,除非視窗1中sql被提交或回滾。 

如何才能讓sql2不等待或等待指定的時間呢? 我們再執行sql3 

3. select * from t where a='1' for update nowait; 則在執行此sql時,直接報資源忙的異常。 

若執行 select * from t where a='1' for update wait 6; 則在等待6秒後,報 資源忙的異常。 

如果我們執行sql4 

4. select * from t where a='1' for update nowait skip locked; 則執行sql時,即不等待,也不報資源忙異常。 

現在我們看看執行如下操作將會發生什麼呢? 

在視窗1中執行: 

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

在視窗2中執行: 

select * from t where rownum<=6 nowait skip locked; 

select for update 也就如此了吧,insert、update、delete操作預設加行級鎖,其原理和操作與select for update並無兩樣。 

select for update of,這個of子句在牽連到多個表時,具有較大作用,如不使用of指定鎖定的表的列,則所有表的相關行均被鎖定,若在of中指定了需修改的列,則只有與這些列相關的表的行才會被鎖定。

oracle學習總結 oracle的介紹

1 資料庫的三層結構 client 專用於訪問資料庫 dbms database management system db例項 多個 db例項有很多資料物件 例 表,包,檢視,序列,函式,觸發器,索引 2 在專案中如何選擇資料庫 1 標的 2 功能 3 併發性問題 4 安全 穩定 5 作業系統 un...

oracle 2 oracle的使用者

1 dbca oracle的dbca主要用來管理資料庫,包括建立資料庫 刪除資料庫等。注意 建立資料庫的時候,密碼不能全是數字,也不能以數字開頭 2 ofa oracle flexible architecture oracle優化靈活結構 作用 多oracle版本的管理 ora90 資料庫管理工具...

oracle部分 oracle的分頁查詢

oracle的分頁查詢 問題 當乙個表中的資料量特別大的時候,如果一次性全部顯示給使用者,則造成頁面過於龐大,體驗極差。解決 使用分頁查詢 使用 rownum關鍵字 oracle對外提供的自動給查詢結果編號的關鍵字,與每行的資料沒有關係。注意 rownum關鍵字只能做 的判斷,不能進行 的判斷 se...