在上一篇<學習MVC之租房網站(九)-房源顯示和搜尋>完成了房源的顯示、檢索,然後是使用者的預約看房,以及背景操作員對預約看房的跟單操作。
預約看房僅有将預約資訊儲存到對應表的操作,預約表有字段辨別一條預約是否被受理,接下來背景操作員對未受理的預約請求進行跟單時,會對這個字段的狀态做修改,為了防止高并發時多人同時修改,要設計到資料庫鎖
一 資料庫鎖
資料庫鎖分為樂觀鎖和悲觀鎖兩種,兩種鎖都是為了保證資料庫的單中繼資料不會被多人同時操作。
a) 悲觀鎖,悲觀鎖預設自己在操作資料時,别人一定也會讀取,是以每次都會在操作前加鎖。查了一下,SqlServer中的悲觀鎖有十幾種之多,這兒僅僅是做初步了解,悲觀鎖上鎖後,連查詢也不能進行;從鎖的範圍來分類,悲觀鎖又分為表鎖和行鎖。
b) 樂觀鎖,樂觀鎖則預設自己操作資料時,别人不會同時操作。樂觀鎖要配合表的特殊字段TimeStamp或RowVersion來使用,通過觀察操作資料前後TimeStamp或RowVersion的變化情況來判斷操作是否成功。
c) 悲觀鎖上鎖後别人不能操作,對系統影響很大。在讀取多于寫入的系統中,适合使用樂觀鎖,樂觀鎖允許更大的吞吐量,但如果是經常寫入的系統,就隻能使用悲觀鎖了。另外,樂觀鎖如果上鎖失敗會比較尴尬,類似搶紅包時,雖然點選了“打開”,但進去後紅包卻已被搶光了。
二 資料庫鎖的使用
a) 悲觀鎖的使用。在原生SQL中,可以使用With(xLock)、With(RowLock)等來上鎖,EF則不支援悲觀鎖,若要使用,可借助EF來傳遞原生SQL
b) 樂觀鎖的使用。需要先在資料表增加類型為TimeStamp的字段,新版Sql Server也可以使用RowVersion類型。在EF中使用時,實體要對應添加byte[]類型的屬性,FluentAPI配置方法為Property(..).IsRowVersion。EF在SaveChange時會根據TimeStamp判斷是否更新成功,如果失敗,會抛出DbUpdateConcurrencyException異常,是以更新的代碼可以包裹在try-catch中。

注:
課程内容來自如鵬網(www.rupeng.com),專注于大學生就業的線上教育平台;
ASP.NET MVC課程 http://www.rupeng.com/News/9/640.shtml
歡迎關注我的公衆号【菜鳥程式員成長記】