[英]Concurrent ASP.NET session best practices
用戶A登錄故障單管理系統以編輯“SomePage.aspx”上的內容
用戶B在30秒后登錄以編輯“SomePage.aspx”上的相同票證
用於通知每個用戶其他人正在修改相同內容的一些最着名的實踐(在3層體系結構中)是什么?
在像HTTP這樣的請求/響應系統中,沒有太多關於用戶當前正在做什么的概念。 您可以通知他們其他人在最近兩分鍾內打開了機票進行編輯(或者甚至阻止他們在這種情況下打開它),但是用戶A可以編輯半小時 - 除非您也禁止這樣做。 您可以記下這樣一個事實,即您認為用戶A已經有效地“獲取”了該項目以進行編輯,但是使用Web應用程序時,沒有什么可以阻止用戶離開計算機而從不保存/取消。
在考慮技術解決方案之前,我建議考慮技術限制 (基本上是Web的異步和請求/響應性質)並計算出所需的行為。 一些常見的行為是:
Roundup使用(例如)樂觀並發方法:當您提交更改時,您可能會看到有人在您之前進行了更改的警告,其中包含指向顯示其更改的頁面的鏈接。 您可以單擊“提交”繼續進行更改或編輯表單中的值,然后提交。
這適用於票務系統,因為票證上幾乎沒有共享狀態 - 大多數情況下您附加到消息日志(或等效物),因此這兩條消息會一個接一個地添加。
我對此並不是很有經驗,但如果我需要做類似的事情,我會在Ticket Table上的數據庫上創建一個名為EditingBy的新字段,並添加默認值'0'。
當用戶調用TicketID = 897時,查詢應如下所示:
SELECT * FROM Tickets WHERE TicketID = 897;
UPDATE Tickets SET EditingBy = @UserID WHERE TicketID = 897;
然后在代碼中,您會看到EditingBy是否大於0,您可以警告UserB UserA(您知道UserID)正在編輯故障單,就像有人發布答案並且您正在編寫您的答案,或者當您獲得例如新徽章。
提交更新票證時,您可以將該字段更新回0。
並建議用戶可以輸入SomePage.aspx並離開而不做任何事情,因為body標簽中的javascript onUnload將觸發異步調用以將EdittingBy更新回0,這將是一個想法。
跳,這讓你知道這樣做。
編輯:如果您無法編輯數據庫本身,只需保留TicketID和UserID,而不是查找是否大於0,您可以隨時將EditingBy記錄在XML文件中,只需檢查TicketID是否在XML中。
我發現阻止樂觀並發的最好方法是在數據庫中添加一個名為timestamp的字段,例如:SQLTimeStamp。 此字段為表中的每個記錄維護唯一值。 當用戶A查詢表進行編輯時,將sqltimestamp值存儲在會話中。 如果用戶B在用戶A之前查詢並更新相同的記錄,則sql時間戳值會發生變化。 如果用戶A現在嘗試存儲編輯的值,首先檢查會話標記是否與數據庫上的當前時間戳相同,如果時間戳不同,則提示用戶有人修改了記錄。
這是我用於Web應用程序的解決方案。
我假設你正在談論一張幫助台票或一些非常有用的東西,其中只有一個用戶應該一次處理它。 在這種情況下,當第一個用戶簽出時,票證的狀態應該會改變
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.