熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ADO.NET Entity Framework 試水——並發[2]

2013-11-13 10:54:16  來源: .NET編程 

  
   放任不管方式 
  
  與其說這是一種處理並發沖突的方式不如說它是一種沒有對並發沖突做任何處理的方式但是在許多過去的系統裡由於沒有考慮到多用戶網絡應用等情況這種處理方式還真存在於不少系統中 
  
  舉例來說AB兩人從數據庫中獲取了同一個筆記本的信息例如IBM ThinkPad T然後A把牌子改成了Lenovo ThinkPadB把型號改成了T A然後他們開始提交了此時如果A先提交然後B提交那麼最後的結果是IBM ThinkPad T A反之則變成Lenovo ThinkPad T 
  
  總之一句話誰最後提交誰老大想像一下如果A修改了個屬性的值B修改了個屬性的值那麼對於先提交的A來說這將是一個多麼慘痛的打擊:
  
  雖然這種放任不管的方式似乎不太負責任但是其處理性能卻是相對較高的 
  
   開放式並發處理 
  
  開放式並發處理老外叫做Optimistic Concurrency——樂觀的並發這種並發處理方式要求我們對並發抱有一種樂觀的態度百分之九十九點九九不會發生並發沖突萬一發生了系統也能捕獲到沖突或者根據策略自動處理或者就提醒一下用戶讓用戶來決定是不是要繼續提交 
  
  仍然用上面的例子來說這事兒AB兩個人同時獲取了筆記本的信息IBM ThinkPad T然後……(此處跟上例做一樣的修改直到提交)此時如果A先提交那麼B提交的時候系統會發現哎喲不好有並發沖突了就會拋個異常給B讓B知道發生並發沖突了然後B就可以根據實際情況選擇相應的處理策略(比如繼續提交進行覆蓋或者取消提交等等)相反如果B先提交那麼A提交時就會得到相應的提醒
  這樣的並發處理方式可以說在可靠性與性能上取得平衡適合於對數據可靠性要求不是特別嚴格需要較高的性能並且不會大量發生並發的場合 
  
   保守式並發處理 
  
  這是最為嚴謹的一種並發沖突的處理方式它把並發轉化為了串行操作 
  
  例如A從數據庫中獲取了筆記本信息IBM ThinkPad TB也要對其進行修改但此時由於A已經從數據庫中將數據取出因此B被置於等待狀態直到A把數據修改完提交了數據庫數據更新為Lenovo ThinkPad T此時數據庫才把數據給B那麼B就可以在Lenovo ThinkPad T的基礎上把它修改為Lenovo ThinkPad T A而在B提交前其它一切針對此記錄的操作都得排除等著B 
  
  這樣子當然非常理想由於不存在並發自然也就消除了並發沖突的問題但是這種鎖也存在著較為隱蔽的風險如果A修改了數據一直不提交或者A因為故障沒有辦法提交那麼其它所有的相關的操作都將被阻礙住因此只有對數據准確性要求極高並且用戶可以忍受等待的情況下使用這種並發沖突的處理方法

  EF並發沖突處理實例 
  
  EF發布時提供了兩種並發沖突處理方式放任不管方式和開放式並發默認采用放任不管的方式處理 
  
  如果要使用開放式並發那麼必須設置相應屬性上的Concurrency Mode值為Fixed我們先對實體類的屬性進行修改讓其支持開放式並發然後來模擬一個並發的序列看看怎麼來處理並發沖突 

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/net/201311/14741.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.