Select For Update語句與鎖

2021-08-30 18:41:42 字數 1030 閱讀 4519

select…for update語句與鎖

select…for update語句的語法與select語句相同,只是在select語句的後面加for update [nowait]子句。

該語句用來鎖定特定的行(如果有where子句,就是滿足where條件的那些行)。當這些行被鎖定後,其他會話可以選擇這些行,但不能更改或刪除這些行,直到該語句的事務被commit語句或rollback語句結束為止。

如圖20.51所示,左上角的會話用select…for update語句鎖定了department表中deptno='01'的行,右上角的會話說明其他會話不可以繼續更改該行上的資料。從oem中的鎖的資訊可以看出,select…for update語句所加的鎖與update語句所加的鎖相同:乙個行級別的exclusive鎖(說明多個事務不能同時操作同一行)、乙個表級別的row exclusive鎖。

圖20.51  select…for update語句鎖定了符合where條件的行

如圖20.52所示,左上角的會話用update語句鎖定了department表中deptno='01'的行,右上角的會話說明其他會話不可以用select…for update語句繼續鎖定該行。

圖20.52  select…for update語句被其他會話阻塞了

如圖20.53所示,左上角的會話用update語句鎖定了department表中deptno='01'的行,右上角的會話說明其他會話不可以用select…for update nowait語句繼續鎖定該行,且會立即返回乙個錯誤提示「ora-00054: 資源正忙, 但指定以 nowait 方式獲取資源」,而不需要等待加鎖成功。

圖20.53   如果加鎖不成功,則select…for update nowait語句就會立即返回錯誤提示

可以看出,如果僅僅用update語句來更改資料時,可能會因為加不上鎖而沒有響應地、莫名其妙地等待,但如果在此之前,先用select…for update nowait語句將要更改的資料試探性地加鎖,就可以通過立即返回的錯誤提示而明白其中的道理,或許這就是for update和nowait的意義之所在。

原文:

用select for update注意事項

今天犯了乙個特二的問題,過程如下 希望首先用select.for update進行查詢,然後根據查詢的結果對記錄逐條的update proxool連線池 結果發現db死鎖。查了半天最後發現 1.在select.for update的時候用了executequery方法查詢,該方法即使setautoc...

select for update 行級鎖,表級鎖

mysql 使用select for update 做事務寫入前的確認 以mysql 的innodb 為例,預設的tansaction isolation level 為repeatable read,在select 的讀取鎖定主要分為兩種方式 select lock in share mode s...

TOP語句與Order By語句

預設情況下,如果在子查詢,函式,檢視中嘗試去使用order by,create view dbo.vsortedorders asselect orderid,customerid from dbo.orders order by orderid go那麼可能會遇到下面的錯誤 訊息 1033,級別 ...