樂觀鎖悲觀鎖應用

2022-01-12 13:07:51 字數 2844 閱讀 5192

最近悟出來乙個道理,在這兒分享給大家:學歷代表你的過去,能力代表你的現在,學習代表你的將來。

十年河東十年河西,莫欺少年窮

學無止境,精益求精

之前我的部落格:

sql-樂觀鎖,悲觀鎖之於併發詳細介紹了樂觀鎖悲觀鎖的應用,在此,通過程式來驗證:

首先,開啟sqlserver,新建一張表:

create table ticket

(id

int identity(1,1

) primary key,

ticketcount

int,

)insert into ticket values(300)

我們首先示範悲觀鎖:如果您還不太明白悲觀鎖的原理,請查閱我的上篇部落格sql-樂觀鎖,悲觀鎖之於併發

悲觀鎖在使用過程中會鎖住要操作的物件,其他使用者可以查詢該物件的內容,但是不能更新該物件,直至悲觀鎖釋放資源。因此,悲觀鎖以嚴格的控制併發,從而使併發零發生。

請在sqlserver中開啟兩個查詢視窗,並輸入如下語句:

declare @count as

intbegin tran

select @count=ticketcount from

ticket with(updlock)

waitfor delay

'00:00:05

'update ticket

set ticketcount=@count-1

commit tran

select * from ticket

上述語句中的waitfor delay '00:00:05' 代表延遲五秒,用於模擬併發。with(updlock)代表查詢時,上了悲觀鎖,一旦上了悲觀鎖,其他使用者必須等待悲觀鎖釋放後才能訪問被鎖定的物件,否則,處於等待狀態!

快速執行每個視窗中的語句:

執行結果如下:

從上圖可以看出,執行二次的結果票數減少2,執行結果正確

要說明的是,在視窗2執行時,必須要等到視窗1執行結束,如果窗體1還在執行,則窗體2處於等待狀態。

為了驗證悲觀鎖發生了作用,我們將悲觀鎖拿掉,然後再快速執行二個窗體中的語句《將票數重置為300,方便我們測試》:

拿掉悲觀鎖後的語句變更為:

declare @count as

intbegin tran

select @count=ticketcount from

ticket

waitfor delay

'00:00:05

'update ticket

set ticketcount=@count-1

commit tran

select * from ticket

快速執行二個窗體語句,執行結果如下:

由圖可知發生了併發,原因是出現了髒讀《表中的實際值是299,出了二張票,而票數卻只減少1,這顯然是錯誤呀的》。

下面直接貼出樂觀鎖**:

修改表結構:新增一列,資料型別為時間戳

alter table ticket add timeflag timestamp not null
然後修改事務如下:

declare @count as

intdeclare @flag

astimestamp

declare @rowcount as

intbegin tran

select @count=ticketcount,@flag=timeflag from

ticket

waitfor delay

'00:00:05

'update ticket

set ticketcount=@count-1

where timeflag=@flag

set @rowcount=@@rowcount

if @rowcount>0

print

'更新成功

'else

print

'更新失敗

'commit tran

select * from ticket

窗體1執行圖

窗體2執行圖

由圖可知,窗體2執行失敗,是因為當窗體1執行後,時間戳會隨著時間變更變為乙個新的值,而再次執行時,由於時間戳不同,造成執行失敗,從而避免了併發帶來的影響。

出了一張票,票數減少1,執行結果正確

為了使系統更加流暢,在窗體2執行失敗後,應再次讀取資料庫並重新執行!

@陳臥龍的部落格

悲觀鎖樂觀鎖

1 悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無...

樂觀鎖 悲觀鎖

悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。樂觀鎖 optim...

樂觀鎖 悲觀鎖

樂觀鎖 悲觀鎖 悲觀鎖 pessimistic locking 悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保...