首頁  >  文章  >  資料庫  >  oracle中for update的用法是什麼

oracle中for update的用法是什麼

WBOY
WBOY原創
2022-03-02 12:05:3714829瀏覽

在oracle中,「for update」是一種行級鎖,用於給某個行施加行級鎖,加鎖的用戶可以查詢和更新資料行,但其他用戶不能查詢和更新被加鎖的行,語法為「SELECT * FROM 表名WHERE 欄位名  FOR UPDATE;」。

oracle中for update的用法是什麼

本教學操作環境:Windows10系統、Oracle 11g版、Dell G3電腦。

oracle中for update的用法是什麼

一、for update定義

for update是一種行級鎖,又叫排它鎖,一旦使用者對某個行施加了行級加鎖,則該使用者可以查詢也可以更新被加鎖的資料行,其它使用者只能查詢但不能更新被加鎖的資料行.如果其它使用者想要更新該表中的資料行,則也必須對該表施加行級鎖定.即使多個使用者對一個表均使用了共享更新,但也不允許兩個事務同時對一個表進行更新,真正對表進行更新時,是以獨佔方式鎖表,一直到提交或復原該事務為止。行鎖永遠是獨佔方式鎖。

只有當出現如下之一的條件,才會釋放共享更新鎖定:

1、執行提交(COMMIT)語句

2、退出資料庫(LOG OFF)

3、程式停止執行

二、概念和用法

#通常情況下,select語句是不會對資料加鎖,妨礙影響其他的DML和DDL操作。同時,在多版本一致讀取機制的支援下,select語句也不會被其他類型語句所阻礙。

而select … for update 語句是我們常用手動加鎖語句。在資料庫中執行select … for update ,大家會發現會對資料庫中的表或某些行資料進行鎖定表,在mysql中,如果查詢條件有主鍵,會鎖行數據,如果沒有,會鎖表。

 由於InnoDB預設是Row-Level Lock,所以只有「明確」的指定主鍵,MySQL才會執行Row lock (只鎖定被選取的資料範例) ,否則MySQL將會執行Table Lock (將整個資料表單給鎖住)。

舉例: 假設有張表user ,裡面有 id 和 name 兩列,id是主鍵。

範例1: (明確指定主鍵,且資料真實存在,row lock)

SELECT * FROM user WHERE id=3 FOR UPDATE;
SELECT * FROM user WHERE id=3 and name='Tom' FOR UPDATE;

範例2: (明確指定主鍵,但資料不存在,無lock)

SELECT * FROM user WHERE id=0 FOR UPDATE;

例3: (主鍵不明確,table lock)

SELECT * FROM user WHERE id<>3 FOR UPDATE;
SELECT * FROM user WHERE id LIKE &#39;%3%&#39; FOR UPDATE;

例4: (無主鍵,table lock)

SELECT * FROM user WHERE name=&#39;Tom&#39; FOR UPDATE;

注意:

#1、FOR UPDATE僅適用於InnoDB,且必須在事務處理模組(BEGIN/COMMIT)中才能生效。

2、要測試鎖定的狀況,可以利用MySQL的Command Mode(指令模式) ,開兩個視窗來做測試。

3、Myisam 只支援表級鎖定,InnerDB支援行級鎖定 新增了(行級鎖定/表級鎖定)鎖定的資料不能被其它事務再鎖定,也不被其它事務修改。是表級鎖定時,不管是否查詢到記錄,都會鎖定表。

三、什麼時候需要使用for update?

借助for update語句,我們可以在應用程式的層級手動實作資料加鎖保護運算。就是那些需要業務層面資料獨佔時,可以考慮使用for update。

場景上,例如火車票訂票,在螢幕上顯示有票,而真正進行出票時,需要重新確定一下這個資料沒有被其他客戶端修改。所以,在這個確認過程中,可以使用for update。

四、for update悲觀鎖定

悲觀鎖定:總是假設最壞的情況,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會阻塞直到它解鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,例如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。就像for update,再例如Java裡面的同步原語synchronized關鍵字的實作也是悲觀鎖定。

樂觀鎖:顧名思義,就是很樂觀,每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號等機制。樂觀鎖適用於多讀的應用類型,這樣可以提高吞吐量,像是資料庫提供的類似write_condition機制,其實都是提供的樂觀鎖。

推薦教學:《Oracle影片教學

以上是oracle中for update的用法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn