C 樂觀鎖 悲觀鎖 共享鎖 排它鎖 互斥鎖

2022-02-16 07:48:07 字數 2509 閱讀 7760

悲觀鎖(pessimistic lock), 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。 通過 jdbc 實現時 sql 語句只要在整個語句之後加 for update 即可。例如: select …for update

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

兩種鎖各有優缺點,不可認為一種好於另一種,像樂觀鎖適用於寫比較少的情況下,即衝突真的很少發生的時候,這樣可以省去了鎖的開銷,加大了系統的整個吞吐量。但如果經常產生衝突,上層應用會不斷的進行retry,這樣反倒是降低了效能,所以這種情況下用悲觀鎖就比較合適

共享鎖:(讀取)操作建立的鎖。其他使用者可以併發讀取資料,但任何事物都不能獲取資料上的排它鎖,直到已釋放所有共享鎖。

共享鎖(s鎖)又稱為讀鎖,若事務t對資料物件a加上s鎖,則事務t只能讀a;其他事務只能再對a加s鎖,而不能加x鎖,直到t釋放a上的s鎖。這就保證了其他事務可以讀a,但在t釋放a上的s鎖之前不能對a做任何修改。

在第乙個連線中執行以下語句

begin tran

select * from table1 holdlock -holdlock人為加鎖

where b='b2'

waitfor delay '00:00:30' --等待30秒

commit tran

在第二個連線中執行以下語句

begin tran

select a,c from table1

where b='b2'

update table1

set a='aa'

where b='b2'

commit tran

若同時執行上述兩個語句,則第二個連線中的select查詢可以執行

而update必須等待第乙個事務釋放共享鎖轉為排它鎖後才能執行 即要等待30秒

排它鎖:排它鎖又稱為寫鎖((exclusive lock,簡記為x鎖)),若事物t對資料物件a加上x鎖,則只允許t讀取和修改a,其它任何事務都不能再對a加任何型別的鎖,直到t釋放a上的鎖。它防止任何其它事務獲取資源上的鎖,直到在事務的末尾將資源上的原始鎖釋放為止。

在第乙個連線中執行以下語句

begin tran

update table1

set a='aa'

where b='b2'

waitfor delay '00:00:30' --等待30秒

commit tran

在第二個連線中執行以下語句

begin tran

select * from table1

where b='b2'

commit tran

若同時執行上述兩個語句,則select查詢必須等待update執行完畢才能執行即要等待30秒

互斥鎖(mutex)

互斥鎖是乙個互斥的同步物件,意味著同一時間有且僅有乙個執行緒可以獲取它。

互斥鎖可適用於乙個共享資源每次只能被乙個執行緒訪問的情況

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading;

namespace

myttcon

class

incthread

void

run()

while (number > 0

); console.writeline(thrd.name + "

釋放 the nmutex");

//釋放

shareres.mutex.releasemutex();}}

class

decthread

void

run()

while (number > 0

); console.writeline(thrd.name + "

釋放 the nmutex");

//釋放

shareres.mutex.releasemutex();}}

class

program

}}

小結:悲觀鎖:查詢加鎖 【select ...... for update】

樂觀鎖:修改加鎖 【版本號控制】

共享鎖:事務a可以查詢、修改,同時事務b也可以查詢但不能修改

互斥鎖:同一資源同一時間只能被乙個執行緒訪問

mysql樂觀鎖 悲觀鎖 共享鎖與排它鎖

樂觀鎖 樂觀併發控制 和悲觀鎖 悲觀併發控制 是指資料庫在對待併發上控制的兩種思想,共享鎖和排它鎖是具體的鎖的實現,且都屬於悲觀鎖。樂觀鎖沒有加鎖 獲取資料的時候不用獲取鎖,直到需要更新資料的時候才去檢查獲取的記錄是否已被其他事務更新,如果更新了則返回錯誤拋異常。注意的是,樂觀鎖中沒有鎖機制,通常的...

樂觀鎖 悲觀鎖 共享鎖以及排它鎖的概念

樂觀併發控制 又名 樂觀鎖 optimistic concurrency control,縮寫 occ 它假設多使用者併發的事務在處理時不會彼此互相影響,各事務能夠在不產生鎖的情況下處理各自影響的那部分資料。在提交資料更新之前,每個事務會先檢查在該事務讀取資料後,有沒有其他事務又修改了該資料。如果其...

樂觀鎖 悲觀鎖 共享鎖和排它鎖的簡單理解

個人簡單理解 樂觀鎖 樂觀併發控制 和悲觀鎖 悲觀併發控制 是指資料庫在對待併發上控制的兩種思想,共享鎖和悲觀鎖是具體的鎖的實現,且都屬於悲觀鎖。樂觀鎖沒有加鎖 2.排它鎖 x 寫鎖 一旦被上上排它鎖 x 該事務可進行讀寫操作,其他事務只能等到該事務釋放了鎖後才能獲取鎖 這兩種鎖都是在進行資料操作是...