2010-08-23 53 views
1

我有一個遺留的ASP.NET應用程序,其中有一些會話/併發相關的問題和不一致。ASP.NET會話和併發

我找做的最好的方式重新設計/

這是該方案 A.多個用戶可以登錄到該網站,訪問/修改票證的詳細信息。但是,如果用戶已經在更改工作流程...... TicketId,UserId存儲在帶有時間戳的數據庫中。

B.如果另一個用戶嘗試訪問相同的工單,而其他用戶已經在工作。然後,從數據庫訪問數據,最近的用戶會收到一個信息框,說明該票證已被鎖定。

C.如果初始/鎖定用戶執行「註銷」,鎖定將在數據庫中釋放。現在,隨後的用戶可以無憂無慮地訪問

所有這一切都好......但如果最初的用戶不是「退出」......只是關閉瀏覽器窗口......應用程序仍然被鎖定。

如何避免這種情況?這種情況下最好的設計是什麼?

回答

2

這被稱爲新派併發。您可以處理SessionEnd事件(但僅在您使用InProc會話時)並釋放故障單上的鎖定。問題是會話默認在20分鐘後過期。所以,如果你真的想要使用新式併發,你必須儘可能縮短會話時間,但這會影響當前用戶 - 會話在瀏覽器中工作時可能會丟失。爲了避免這個實現javascript定時器和一些ping javascript/ajax操作,這會在用戶打開瀏覽器時保持會話活動。如果他關閉瀏覽器而不釋放票證會話將很快到期。仍然有缺點 - 如果您的用戶關閉瀏覽器,並在一段時間後打開新的會議數據將丟失。

編輯:此外,此解決方案不處理用戶打開瀏覽器,鎖定門票並消失2小時午餐的情況。如果您還想處理此解決方案,則可以將其與票證活動的一些超時組合在一起。

+0

我相信很多網站都這樣做......使用「保持活躍」ping到服務器。 – Polaris878 2010-08-23 20:58:14

0

在我看來,你可以做的最好的事情就是建立一個換班超時。當票證被鎖定時,您可以使用它被鎖定的時間戳。無論何時他人嘗試訪問此票證,您都可以檢查以查看它是否被鎖定,以及何時被鎖定以及是否被鎖定超過了哦...比方說5小時前,您可以提示用戶解開票證,但失去了以前的用戶修改。

你可以滾各種基於角色的邏輯進去也只有給某些人的權利,解鎖等

0

不幸的是你有沒有其他選擇,只是超時「鎖定到期編輯會話」。由於瀏覽器和服務器之間的鏈接不是一個持久/可靠的鏈接,因此您無法真正檢測到用戶已放棄工作的所有方式,包括突然的瀏覽器關閉,客戶端寬帶調制解調器重置,網絡中斷或電源中斷。所以你所能做的就是讓這些物品上的'鎖'超時。如果用戶沒有完成工作,比如說30分鐘,那麼該項目將返回到可用項目池中。這個'返回'不一定是一個主動操作,它可以是隱含的:'鎖定'或保留一個工作項的行爲添加UTCNOW()+ 30分鐘的時間戳。任何時間戳記過去的任何項目都適合抓取並認爲已解鎖(即用戶在30分鐘內未完成任務)。如果用戶從午餐返回並嘗試在45分鐘後完成工作,則拒絕提交併要求他重新開始。如果用戶定期刷新工作(比如說每10分鐘節省一次),那麼可能會延長「鎖定」時間,並延長30分鐘。

對於這種模式,你應該看看Using Tables as Queues