MVC3+EF4.1學習系列(七)-----EF并發的處理
看這篇文章之前 推薦園子里的 這個文章 已經有介紹了 而且寫的很好~~ 可以先看下他的 再看我的
并發
1.悲觀并發
簡單的說 就是一個用戶訪問一條數據時 則把這個數據變為只讀屬性 把該數據變為獨占 只有該用戶釋放了這條數據 其他用戶才能修改 這期間如果該用戶上個廁所 出去玩一圈 沒有退出 則其他人都要等很久 很顯然 這不是我們期望的效果 也不是這篇文章討論的重點
2.樂觀并發
樂觀并發相對悲觀并發,用戶讀取數據時不鎖定數據。當一個用戶更新數據時,系統將進行檢查,查看該用戶讀取數據后其他用戶是否又更改了該數據。如果其他用戶更新了數據,將產生一個錯誤。這也是這篇文章主要講的。
如何讓EF實現樂觀并發呢 其實很簡單 只用簡單三部就可以打造樂觀并發了~
以院系類為例子
第一步 . 給實體類添加 一個時間戳
[Timestamp]
public Byte[] Timestamp { get; set; }
第二步,在我們的院系編輯視圖里 加上
@Html.HiddenFor(model => model.Timestamp)
也就是說 在讀取的時候 把這個時間戳讀取出來
第三步,捕獲并發異常給用戶一個友好的提示
[HttpPost]
public ActionResult Edit(Department department)
{
try
{
if (ModelState.IsValid)
{
db.Entry(department).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
}
catch (DbUpdateConcurrencyException ex)
{
ModelState.AddModelError(string.Empty, "友好的提示");
}
}
好了 這時可以如果有 如下情況 一個用戶打開編輯院系 另一個也打開了編輯院系 當一個提交后 另一個再提交 則會提示出 友好的提示 告訴他 數據已經變更了~~
3.思考
并發管理 雖然實現了 EF幫我做了 但是我們不應該只局限與實現 要去想想中間給了我們哪些啟發
打開SQL監控 開開更新時 EF幫我們做了哪些操作
exec sp_executesql N'update [dbo].[Department]
set [Name] = @0, [Budget] = @1, [StartDate] = @2, [InstructorID] = @3
where (([DepartmentID] = @4) and ([Timestamp] = @5))
select [Timestamp]
from [dbo].[Department]
where @@ROWCOUNT > 0 and [DepartmentID] = @4',N'@0 nvarchar(50),@1 decimal(19,4),@2 datetime,@3 int,@4 int,@5 binary(8)',@0=N'WLF',@1=10000.0000,@2='09 1 2007 12:00:00:000AM',@3=3,@4=3,@5=0x00000000000007D9
我們看到 更新后 查詢Timestamp
于是 個人猜想 不見得對 過程應該是這樣的
用戶讀取 這條數據時 讀取到他的 Timestamp 然后更新時 檢測則個和上次是否一樣 不一樣 說明有人剛才更新過了 這個方法 我們在用ado.net時 同樣可以用到~~
細心的朋友會發現 上面的SQL語句更新時 并沒有更新 Timestamp 啊
這里再說下這個 timestamp
每個數據庫都有一個計數器,當對數據庫中包含 timestamp 列的表執行插入或更新操作時,該計數器值就會增加。 該計數器是數據庫時間戳。 這可以跟蹤數據庫內的相對時間,而不是時鐘相關聯的實際時間。 一個表只能有一個 timestamp 列。 每次修改或插入包含 timestamp 列的行時,就會在 timestamp 列中插入增量數據庫時間戳值。
詳見 MSDN------原文
總結
學習應該多去思想 了解原理 才能破而后立 ~~
下一節 EF處理繼承
浙公網安備 33010602011771號