当前位置: 首页>JAVA>正文

wait for的用法,oracle for update wait 解析

wait for的用法,oracle for update wait 解析

總結:

select for update 可以看成 select for update wait UN-LIMITED——查詢記錄如果被鎖,則等待釋放。執行過程中"自己"也會上行級鎖,直到事務提交select for update wait X—— 對某個記錄進行查詢,如果有被鎖,則等待X秒。同樣執行過程會上鎖。select for update nowait —— 對某個記錄進行查詢,如果有被鎖,則直接報錯。

轉載自(原文錯誤的地方,這里已標紅修改):select for update和select for update wait和select for update nowait的區別 - 鄭小超 - 博客園https://www.cnblogs.com/GreenLeaves/p/6576646.html

CREATE TABLE "TEST6" 
(    "ID" VARCHAR2(30), "NAME" VARCHAR2(30), "AGE" NUMBER(2,0), "SEX" VARCHAR2(2), "ENAME" VARCHAR2(30), "ADDTIME" DATE
)
insert into TEST6 (id, name, age, sex, ename, addtime) values ('1', '張三', 18, null, 'zhangsan', to_date('14-03-2017 00:00:09', 'dd-mm-yyyy hh24:mi:ss'));
insert into TEST6 (id, name, age, sex, ename, addtime) values ('2', '李四', null, '1', 'Lisi', to_date('01-03-2017 02:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into TEST6 (id, name, age, sex, ename, addtime) values ('3', '王五', 20, '0', 'wangwu', to_date('09-01-2017 08:55:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into TEST6 (id, name, age, sex, ename, addtime) values ('4', '趙六', 23, '0', 'zhaoliu', to_date('03-03-2016 04:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into TEST6 (id, name, age, sex, ename, addtime) values ('5', '馮七', 22, null, 'fengqi', to_date('08-03-2017 12:00:01', 'dd-mm-yyyy hh24:mi:ss'));
CREATE TABLE "TEST8" 
(    "ID" NUMBER, "ORDERID" NUMBER, "PRODUCTID" NUMBER, "PRICE" NUMBER(10,2), "QUANTITY" NUMBER
) 
insert into TEST8 (id, orderid, productid, price, quantity) values (1, 1, 1, 6, 10);
insert into TEST8 (id, orderid, productid, price, quantity) values (2, 1, 2, 4, 5);
insert into TEST8 (id, orderid, productid, price, quantity) values (3, 1, 3, 10, 2);
insert into TEST8 (id, orderid, productid, price, quantity) values (4, 2, 1, 3, 6);
insert into TEST8 (id, orderid, productid, price, quantity) values (5, 2, 2, 4, 6);

以上是基礎數據

在oracle中,如果只進行select語句的話,是不會進行加鎖的,也就是oracle會返回當前時刻的結果集,即使這個時候可能有另外一個進程在修改當前結果集的數據,因為沒有加鎖,所以oracle還是會正常的返回當前時刻的結果集,不會有任何影響。

wait for的用法、他們三個共同點:

當使用select for update 或者select for update wait或者.....,那么oralce會給符合where條件的數據行加上一個行級鎖

1、select for update

但是如果你的select 語句加了for update,那么就不是上面這回事了,當oracle發現select的當前結果集中的一條或多條正在被修改(注意:當數據被修改時,此時的數據行是被加鎖的),那么他就會等到當前當前結果集被修改完畢并且commit之后才進行select操作,并對結果集進行加鎖。同樣的,如果查詢語句發出后,其他會話需要修改結果集中的一條(或幾條數據)也許要等到查詢結束(commit)之后,才可以執行修改操作。

代碼如下:

新建SQL窗口1,(相當于新建一個session會話)

select * from test8 for update

數據庫update,

for ?update 對整個結果集進行了加鎖,意味著在當前session進行commit之前,任何其他的session進行update、delete、select for update操作都會進行等待。

注意:Oracle中insert 是可以執行的,Oracle的隔離級別是讀已提交,是存在幻讀的。

新建SQL窗口2(相當于新建一個session會話)

update test8 set price=6 where ID=1

顯示執行中,等待會話一的查詢執行完成

oracle更新字段。

現在我們將會話一的事務提交(commit)

會話二的update語句執行成功

2、select for update nowait

wait怎么讀,for ?update和for update nowait都會對查詢到的當前結果集進行加鎖,所不同的是,當有另外的會話在修改當前結果集中的數據,select for nowait所進行的查詢操作不會進行等待,當發現結果集中的一些數據被加鎖,立刻返回 “ORA-00054錯誤,內容是資源正忙, 但指定以 NOWAIT 方式獲取資源”。測試代碼如下:

新建一個SQL窗口1(相當于新建一個會話)

update test8 set price=3 where ID=1

更新test8表的一條數據,但是不進行commit操作

然后新建SQL窗口2(相當于新建一個會話)select for update nowait操作

select * from test8 for update nowait

總結分析:

update oracle,因為會話一,并沒有commit所以test8中的ID=1的行被加鎖了,所以當會話二進行select for update nowait檢索到ID=1的數據行被加鎖了,就立刻返回 “ORA-00054錯誤,內容是資源正忙, 但指定以 NOWAIT 方式獲取資源”的錯誤。

接下來我們對會話一進行commit操作,

在執行會話二的select查詢,ok,可以查出來了,并且對當前數據集進行了加鎖操作,其他會話想要進行修改操作,必須等到會話二commit之后

oracleupdate多個字段,

3、select for update wait

它也會對查詢到的結果集進行加鎖,select for update wait與select for update nowait不同的地方是,當有另外的會話對它的查詢結果集中的某一行數據進行了加鎖,那么它不會像nowait一樣,立即返回"ORA-00054錯誤",而是它支持一個參數,設定等待的時間,當超過了設定的時間,那一行數據還處于加鎖的狀態,那么它也會返回“ORA-00054錯誤,內容是資源正忙, 但指定以 NOWAIT 方式獲取資源”。測試代碼如下:

首先新建SQL窗口1(相當于新建一個會話)執行update 語句,但是不進行commit操作,那么當前數據行將被lock

update test8 set price=3 where ID=1

接著新建SQL窗口2(相當于新建一個會話),在執行select for update wait 6,如果當前查詢檢索的數據集中,有被加鎖了的行數據,那么等待6秒,如果6秒后,其他會話,還沒有執行commit釋放被加了鎖的數據行的話,那么返回“ORA-00054錯誤,內容是資源正忙, 但指定以 NOWAIT 方式獲取資源”。

select * from test8 for update wait 6

oracle for update??

執行語句6秒后,報錯。

最后對會話一(SQL窗口一)進行commit操作

緊接著執行會話二(SQL窗口二)中的sql語句,此時被加鎖的數據行被釋放

oracle批量update數據,正常的檢索除了數據行,當時當前數據集被加鎖,其他會話想操作此數據集,必須等會話二中的事務commit之后,才可以進行修改

4、OF子句

在多表查詢中如果需要對多表查詢的結果集進行加鎖,可以使用OF子句。

如果存在OF子句,那么就對滿足OF子句的單表進行加鎖,如果不存在OF子句就對整個結果集進行加鎖,代碼如下:

a、不使用OF子句

select a.ID,a.Name,b.price from test6 a
LEFT JOIN test8 b
ON a.ID=b.ID where b.ID>3
for update

沒有進行commit操作,此時對test6和test8中的ID>3的數據行都進行了加鎖,測試代碼如下:

新建一個會話,執行以下語句:

select * from test6 for update skip locked

select * from test8 for update skip locked

測試結果證明,在沒有OF子句的情況下,對多表查詢的結果集進行select foe update,oracle會對滿足where 條件的所有數據行進行加鎖

b、使用OF子句

使用OF子句,那么oracle就會對滿足OF子句的表進行加鎖,在多表查詢中。代碼如下:

select a.ID,a.Name,b.price from test6 a
LEFT JOIN test8 b
ON a.ID=b.ID where b.ID>3
for update of a.ID

在不執行commit操作的情況,新建一個會話,執行一下語句:

select * from test6 for update skip locked

select * from test8 for update skip locked

比對測試結果,發現在OF子句的作用下,oracle對同時滿足where子句(設置要加鎖的數據行)和OF子句(主要設置加鎖的表)的數據行進行了加鎖。

https://www.nshth.com/java/338456.html
>

相关文章:

  • wait for的用法
  • 數據庫update
  • oracle更新字段
  • wait怎么讀
  • update oracle
  • oracleupdate多個字段
  • oracle for update
  • oracle批量update數據
  • 有一個解謎的有外星人的游戲,【Pygame小游戲】 史上最經典的外星人游戲 ,全面保障 勇敢去闖 (未解之謎)
  • 2020年2月編程語言排行榜:Java第一,Python出現下滑!
  • 開一家手機配件店怎么樣,手機配件實體店好做不_震驚!手機實體店,你不得不防的套路!
  • bld設計公司,BLE外設設計
  • 手機如何連接外設,iOS 連接外設的幾種方式
  • 三星手機換電池視頻教程,三星2016換電池教程
  • 機械設計制造畢業設計題目,機械專業夾具類畢業設計題目匯總/組合機床、車床撥叉、飛錘支架、連接座、倒擋撥叉、蓋、法蘭盤、銅襯軸套、心軸零件、曲軸箱零件、托板、發動
  • Shell基礎(四):字符串截取及切割、字符串初值的處理、基使用Shell數組、expect預期交互、使用正則表達式...
  • shell編程入門,shell基礎之04
  • 計算機基礎知識試題及答案(全),計算機序列類型和字典試題,計算機考試試題和資料
  • 新開店鋪怎么做推廣,淘寶新開店鋪沒有生意不會推廣的苦衷與心得
  • 如何注冊商標,給大家科普一下商標小知識沒注冊下來的商標,做吊牌,做包裝袋,發朋友圈廣告時千萬不能打R。將未注冊商標冒充注冊商標使用的,或者使用未注冊商標的,最高
  • 商標繳費后多久初步審核通過,商標注冊需要多久下證
  • 商標買賣,信用百度公司商標信息爬取
  • 商標檢索網站,中國商標網 -爬蟲
  • 應用商店上架app容易么,iOS App 上架App Store及提交審核(Appuploader)
  • app證書失效了怎么辦,iOS證書申請打包上傳App Store審核完整流程(7個步驟)
  • 銀行合并后,10萬億同業存款免繳存準 全面降準將推遲
  • kindle買8g還是32g,萬字長文!對比分析了多款存儲方案,KeeWiDB最終選擇自己來
  • java中的final關鍵字有哪些用法,Java: static,final,代碼塊 的詳解
  • 服務器反應慢及解決辦法,Linux服務器 大量的CLOSE_WAIT、TIME_WAIT解決辦法
  • wait for的用法,oracle for update wait 解析
  • 如何手動關閉close_wait,CLOSE_WAIT和TIME_WAIT
  • 渲染軟件哪個好用,Windows平臺OpenGL渲染視頻
  • 怎樣說代碼讓人聽不懂,RPA初級認證直通車,不懂代碼也能成為技術大佬
  • java快速開發平臺 開源,快上車!Java技術開發大廠直通車馬上啟動!
  • 架構師培訓,Java高級:java架構師成長直通車pan
  • 【淘寶開店教程】淘寶直通車常見問題講解
  • 《java架構師成長直通車》課程階段一學習筆記
  • 視頻教程-Java面試Offer直通車-Java