2011-04-19 89 views
3

我有一個ASP.NET MVC 2網站。所有buisnes都在數據庫存儲過程中(MS SQL SERVER 2008)。
任務:
某些用戶使用網站創建記錄。適當的行插入到表中。該行具有到另一個表的外鍵,其值在過程中設置。然後,我希望應用程序將記錄(更改外鍵字段)重新分配給另一個,如果它在1分鐘內未處理。
例如:
1.用戶創建記錄A(id = 1, adminId = 1)
2.只有id = 1的管理員才能看到這條記錄,他應該在1分鐘內處理它。
3.如果管理員1在1分鐘內未處理記錄,則應將其重新分配給其他管理員。例如A更新至(adminId = 3)
哪種方式會更好地做到這一點?並行線程?在後臺的另一個應用或...定期事件實現

回答

1

我不認爲你需要一個單獨的過程來處理時間。

如果您追蹤記錄創建時間,可以在應用程序邏輯或數據庫過程中實現上述操作 - 每次從數據庫中提取數據時都會發生這種情況。

所以

  1. 用戶創建記錄A(ID = 1,adminId = 1)與時間戳記TS
  2. 如果管理員試圖訪問該記錄的分貝/應用程序將允許它,如果電流之間的差日期/時間和ts小於1分鐘;如果更多然後1分鐘記錄被重新分配給其他管理
  3. 如果另一個管理員試圖訪問記錄,更再用1分鐘已通過記錄被分配給他們(一分鐘?)

所有上述工作沒有另一個進程協調它(上述所有的數據)並且數據庫可以用於鎖定(通過可以在記錄上加蓋的狀態和時間狀態)。

只有當您想要推送記錄或自動完成上述維護時(對於某些報告)。仍然可以通過檢查記錄是否在獲取其他數據之前重新分配來完成。

有另一個進程並讓它一樣穩定DB是不平凡的,但您可以創建jobs這將定期內DB環境中運行(或者更適用於你的情況,你可以去SMO路徑)。

但是,我相信你沒有描述記錄可能存在的所有狀態(如果adminId | 3不處理記錄,會發生什麼情況)。

編輯 之後的評論讓我解釋一下。 假設你需要每5分鐘(或每1分鐘)完成一些工作,那麼無論你實際上是否每分鐘做一次或者如果你是在用戶第一次請求可能受到影響的數據它。

有兩個方法之間的差異,主要有以下 如果是懶洋洋地做 - 沒有更新,除非用戶請求數據,那麼

懶惰更新與及時更新

  • 的情況下在這張桌子上,您可以節省不必要的定期更新(但是必須確保沒有客戶端正在收到過時的數據! - 例如,在數據庫上運行報告需要您確保數據已更新)
  • 如果在這個表上有大量活動,會有一些開銷(如果在一分鐘內有100個請求,那麼檢查數據是否是最新的將需要額外的資源)
  • 您避免了需要管理和你避免依靠工作(較簡單)
+0

問題是記錄將在管理員之間迭代,直到他們中的任何一個處理它。它應該從一個管理員列表中隱藏起來,在其他人的列表中顯示。 – 2011-04-19 10:19:30

+0

@JooLio,再次閱讀,您隱藏記錄的要求並不衝突 - 您可以先用一個簡單的過程先做好準備 - Dalex爲您提供了有關檢索數據的查詢的更多詳細信息,但您可以使用sp在服務器上你可以用管理員姓名和sp調用將檢查是否有任何記錄需要重新分配,更新它們(如果有必要)並將它們返回給管理員請求數據... – Unreason 2011-04-19 10:24:09

+0

哦,你給了更多的信息,然後我需要。謝謝! – 2011-04-19 14:55:08

1

你不需要外部工具。所有的邏輯都可以內置。 您應該在表中添加包含時間的列,例如LastHandleTime並鎖定。在你的榜樣,當口語陪練嘗試搜索一些東西,邏輯應該是這樣的:

SELECT * FROM Table Where 
    (user='Admin3') Or 
    (DATEDIFF(m,GETDATE(),@LastHandleTime)=1 
     And dbo.fn_ChangeAdminName('Admin3') 
and locked=0) 

這裏功能fn_ChangeAdminName()顯示哪些用戶可以訪問的,而不是「原始」的用戶記錄。