上下文:一個用asp.net MVC + NHibernate編寫的web應用程序。這是一種玩家同時玩的紙牌遊戲,因此他們的動作可能會同時修改實體的同一個字段(他們在字段中都會執行x = x + 1)。看起來很經典,但我不知道如何處理它。如何用NHibernate + asp.net mvc處理這種併發情況?
不用說我不能向用戶顯示彈出窗口,說「實體已被其他玩家修改。合併或取消?」。當你認爲這與一張牌的動作有關時,我不能這樣干預。我的應用程序必須在內部處理這種情況。由於該字段位於實體類中,並且每個會話都有自己的實體實例,因此我不能簡單地採用CLR鎖。這是否意味着我應該使用悲觀併發性,以便每個請求都作用於這個實體,直到玩家完成他的行爲爲止?實際上,每個PlayCard請求都應該使用鎖嗎?
請不要將我發送給NH文檔關於併發性或相似性。我是在這種情況下應該使用的技術,而不是如何在NH中實現它。
感謝
聽起來就像你想要一個系統,其中多個用戶都有能力修改實體屬性(在服務器上),沒有任何併發問題 - 即沒有鎖,但所有更新成功?這當然是不可能的 - 只有兩種可能性 - 要麼鎖定並且一次只允許1次更新,要麼允許所有更新成功,但接受最後一次更新將覆蓋以前的更新。 – BonyT 2011-06-08 14:00:54
我的直覺是我必須鎖定,不僅是更新,而且是「選擇+更新」序列。否則,我的x = x + 1示例將不起作用。我不能接受併發更新,因爲在初始x = 1的情況下,在所有玩家採取行動後,x將是2而不是3。所以我的問題更多的是「我是否正確地說,讓我們說PlayCard操作,所有的Web請求應該會話鎖定」? – 2011-06-08 14:04:42
我不會在這裏使用數據庫。我會讓客戶端ajax調用服務器 - 它可以允許更新或者根據先前存在的更新來阻止它 - 將原始值與當前值進行比較。服務器端,我會把實體保存在一個單例中以提高響應速度。 – BonyT 2011-06-08 14:18:13