簡體   English   中英

並發ASP.NET會話最佳實踐

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM