成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

技術詳解:三招優化.NET中的鎖(組圖)

開發 后端
在多用戶環境中,大家同時更新相同的記錄可能會引發沖突,這個問題用專業的術語描述就叫做并發性。并發會造成什么樣的沖突?并發主要會導致四種常見的問題。

在這篇文章中,我將使用三個方法處理樂觀鎖,包括ADO.NET數據集、SQL Server時間戳數據類型和新舊值檢查,首先我們從并發談起,探討5個并發問題,然后從實際出發,利用這三種方法實現樂觀鎖。

為什么需要鎖?
在多用戶環境中,大家同時更新相同的記錄可能會引發沖突,這個問題用專業的術語描述就叫做并發性。并發會造成什么樣的沖突?并發主要會導致四種常見的問題,詳細情況請看下表。


如何解決上述沖突?
答案是使用樂觀鎖或悲觀鎖,下面將進一步進行闡述。什么是樂觀鎖?顧名思義,樂觀鎖假設多個事務相互不會影響對方,換句話說就是,在樂觀鎖模式下,沒有鎖操作會得到執行,事務只是驗證是否有其它事務修改數據,如果有則進行事務回滾,否則就提交。

樂觀鎖是如何工作的?
1、實現樂觀鎖的方法有多種,但基本原則都一樣,總是少不了下面五個步驟:
2、記錄當前的時間戳
3、開始修改值
4、在更新前,檢查是否有其他人更新了值(通過檢查新舊時間戳實現)
5、如果不相等就回滾,否則就提交
 


圖 1 樂觀鎖的工作原理

實現樂觀鎖的解決方案

在.NET中,實現樂觀鎖的方法主要有三種:
1、數據集(Dataset):數據集是實現樂觀鎖的默認方法,在更新前它會檢查新舊值。
2、時間戳數據類型(timestamp):在你的表中創建一個timestamp數據類型,在更新時,檢查舊時間戳是否等于新時間戳。
3、直接檢查新舊值:在更新時檢查舊值和新值是否相等,如果不相等就回滾,否則就提交。

解決方案1:數據集
正如前面所說的,數據集是處理樂觀鎖的默認方法,下面是一個簡單的快照,在Adapter的update函數上有一個調試點,當我移除斷點運行update函數時,它拋出如下圖所示的并行異常錯誤。
 


圖 2 Update函數執行時拋出的異常錯誤

如果你運行后端分析器,你將會看到更新語句檢查當前值和舊值是否相等:


在這種情況下,我嘗試將“AuthorName”字段值修改為“This is new”,但更新時會檢查舊值“This is old author”,下面是比較舊值的精簡代碼段:


解決方案2:使用timestamp數據類型

SQL Server有一個數據類型是timestamp,它是實現樂觀鎖的另一種途徑,每次更新SQL Server數據時,時間戳會自動產生一個***的二進制數值,時間戳數據類型可用來版本化你的記錄更新。


圖 3 timestamp數據類型

為了實現樂觀鎖,首先需要取得舊的時間戳值,在更新時檢查舊的時間戳值是否等于當前時間戳,如:


然后檢查是否發生了更新操作,如果沒有發生更新,則使用SQL Server的raiserror產生一系列錯誤消息。
 

如果發生了并發沖突,當你如下圖所示這樣調用ExecuteNonQuery時,你應該會看到錯誤傳播。


圖 4 時間戳發生變化,存儲過程產生了錯誤

解決方案3:檢查舊值和新值
許多時候,我們只需要檢查相關字段值的一致性,其它字段則可以忽略,在update語句中,我們可以直接做這種比較。

 

責任編輯:馬沛 來源: 51CTO.com
相關推薦

2025-04-28 00:55:00

2025-02-24 00:00:10

.NET線程池模型

2025-05-09 10:14:19

2009-08-13 17:25:16

2009-10-12 09:02:03

SmartRWLock

2009-02-18 16:34:32

優化Windows啟動時間

2025-02-20 00:28:59

2020-01-16 14:59:32

Java鎖優化CAS

2010-03-16 16:56:45

云計算

2009-12-09 14:11:57

Visual Stud

2009-02-17 17:42:57

服務器虛擬化虛擬化VMware

2009-07-09 09:28:19

.Net Micro

2012-06-14 09:09:43

微軟Windows 8視頻

2009-07-28 13:48:28

ASP.NET樹形圖

2019-01-04 08:00:59

Linux硬件容器

2013-03-22 09:25:59

VCF虛擬化

2009-03-09 17:30:42

.NET FramewXMLXmlReader

2023-06-02 08:29:24

https://wwMutex

2010-01-07 15:57:02

VB.NET ForEach

2009-11-13 15:33:58

ADO.NET數據對象
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91 久久| 一区二区三区免费 | 亚洲欧美日韩精品久久亚洲区 | 精品成人一区 | 日韩一区二区三区在线 | 国产久| 国产精品二区三区在线观看 | 久久久精品视频免费 | 国产一区欧美 | 国产aⅴ| 成年免费在线观看 | 91一区二区三区在线观看 | 亚洲成人一二区 | 亚洲福利av | 色婷婷综合成人av | 国产日韩欧美一区二区 | 黄视频在线网站 | 夜夜骑综合| 国产精品美女一区二区三区 | 亚洲国产精品久久久 | 色综合天天网 | 久久久夜 | 久久综合激情 | 国产成人99久久亚洲综合精品 | 亚洲品质自拍视频网站 | 精品日韩一区二区三区 | 国产免费av在线 | 亚洲一一在线 | 久久精品亚洲 | 免费在线观看一区二区三区 | 狠狠骚| 久久精品国产亚洲 | 国产片侵犯亲女视频播放 | 伊伊综合网 | 亚洲福利片 | 成年人免费看 | 国产亚洲精品精品国产亚洲综合 | se婷婷| 免费同性女女aaa免费网站 | 欧产日产国产精品v | 日日夜夜操天天干 |