最近悟出來乙個道理,在這兒分享給大家:學歷代表你的過去,能力代表你的現在,學習代表你的將來。
十年河東十年河西,莫欺少年窮
學無止境,精益求精
之前我的部落格:
sql-樂觀鎖,悲觀鎖之於併發詳細介紹了樂觀鎖悲觀鎖的應用,在此,通過程式來驗證:
首先,開啟sqlserver,新建一張表:
create table ticket我們首先示範悲觀鎖:如果您還不太明白悲觀鎖的原理,請查閱我的上篇部落格sql-樂觀鎖,悲觀鎖之於併發(id
int identity(1,1
) primary key,
ticketcount
int,
)insert into ticket values(300)
悲觀鎖在使用過程中會鎖住要操作的物件,其他使用者可以查詢該物件的內容,但是不能更新該物件,直至悲觀鎖釋放資源。因此,悲觀鎖以嚴格的控制併發,從而使併發零發生。
請在sqlserver中開啟兩個查詢視窗,並輸入如下語句:
declare @count as上述語句中的waitfor delay '00:00:05' 代表延遲五秒,用於模擬併發。with(updlock)代表查詢時,上了悲觀鎖,一旦上了悲觀鎖,其他使用者必須等待悲觀鎖釋放後才能訪問被鎖定的物件,否則,處於等待狀態!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
快速執行每個視窗中的語句:
執行結果如下:
從上圖可以看出,執行二次的結果票數減少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窗體1執行圖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
'更新成功
'else
'更新失敗
'commit tran
select * from ticket
窗體2執行圖
由圖可知,窗體2執行失敗,是因為當窗體1執行後,時間戳會隨著時間變更變為乙個新的值,而再次執行時,由於時間戳不同,造成執行失敗,從而避免了併發帶來的影響。
出了一張票,票數減少1,執行結果正確
為了使系統更加流暢,在窗體2執行失敗後,應再次讀取資料庫並重新執行!
@陳臥龍的部落格
悲觀鎖樂觀鎖
1 悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無...
樂觀鎖 悲觀鎖
悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。樂觀鎖 optim...
樂觀鎖 悲觀鎖
樂觀鎖 悲觀鎖 悲觀鎖 pessimistic locking 悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保...