2009-09-07 81 views
5

我正在創建一個具有幾個管理屏幕的Web應用程序,用戶可以在其中編輯記錄(例如,更改用戶的聯繫人詳細信息)。訪問這些管理屏幕由角色控制,多個用戶可能有權訪問。現在的問題是如果兩個用戶同時嘗試編輯相同的記錄該怎麼辦。並行修改的Web前端設計

我的問題是與前端,而不是後端。我可以使用哪些模式來設計我的頁面,以便用戶友好並防止併發修改?我可以想到的唯一兩個選項是:

  • 悲觀鎖定:在Web環境中,在大多數情況下需要等待會話超時之前很難進行。
  • 樂觀鎖定:在用戶友好方面不太好,因爲用戶可能會填寫一個大型表單,最後只能用「無法保存」的信息來打招呼。

有什麼建議嗎?

+0

樂觀鎖定與用戶友好或其他方面無關;這取決於實施。最大的問題是同一個記錄上同時編輯的預期頻率是多少?如果低,簡單的樂觀鎖定獲勝。 – SteveD 2009-09-07 07:46:50

回答

2

定時預約情況如何?這是許多在線預訂系統中使用的模型。

一個基於普通單表格情況的例子(我希望擴展到更多的表格應該是顯而易見的)在名爲RESERVATION_TIME的表格中添加一列。所有記錄最初都以「多年前」的保留時間填充。

與樂觀鎖定結合使用。在點你進入編輯模式,您

  • 製作備案預約您想

    UPDATE RESERVATION_TIME到現在在哪裏KEY = ID和RESERVATION_TIME超過30分鐘前

這隻有在沒有人將最新更新設置到最近時纔有效。我們的想法是,如果其他用戶已經在工作,我們甚至不允許編輯屏幕被填充。但是,我們將該保留設置爲在30分鐘(或其他)後過期,以便沒有任何內容被「鎖定」。但請注意,我們不是(以數據庫方式)持有悲觀鎖。

  • 現在檢索數據(可能客棧同一TRAN作爲接過預訂)

  • 上回寫檢查的樂觀斷言和清除保留回到很久以前。

現在,這介於任何應用程序的兩個用戶之間的中介保留系統。樂觀鎖定在系統的所有樂觀用戶之間起中介作用,因此用戶仍然可能被激怒,但假設帶外更新很少,那麼您應該獲得可接受的可用性。

一些其他的想法:

  1. 最後保存勝利 - 對某些數據有一個在鎖定沒有意義的。您將允許用戶Bill改變Alice的工作,反之亦然,因此允許任一個獲勝。
  2. 檢測衝突和合並。像CVS源代碼管理系統一樣。使用樂觀的方案,並在發生衝突時提供干預更新和提議的更新,並要求用戶解決衝突。
+0

感謝您的建議,但請您詳細說明您的預訂建議。我不太關注 - 你的意思是我應該使用類似保留的悲觀鎖定,但是如果你沒有獨佔鎖,也允許樂觀鎖定? – Zecrates 2009-09-07 14:20:12

+0

答案更新了一下 – djna 2009-09-07 15:27:49

1

我們實現在類似情況下第一,寫勝機制(或樂觀鎖)

BACKEND:

在數據庫中創建一個時間戳字段(這在MSSQL自動更新插入和更新)

當您加載要編輯的對象(包括timestamp屬性)時,只允許在存儲過程中保存時間戳是否相同,否則引發錯誤,請在應用程序中處理此問題表明記錄已更改,併爲他們提供重新載入頁面的機會。這適用於Web /斷開連接的環境。

前端

頁需要輪詢(使用AJAX)的數據庫來檢測的改變。如果存在改變提示,則指示記錄的用戶已經改變並且可以選擇重新加載/合併。在頁面回發顯示標籤或輔助表單字段(只讀),可以複製右側新輸入的值,例如向左箭頭按鈕,將值複製回原始表單字段。

+0

這是樂觀的鎖定不是嗎?重新加載是提問者所面臨的問題 - 如果用戶只是花了10分鐘在UI中填充大量詳細信息,那麼這種問題就非常友好。 「太晚了,我們已經得到了一個!再次輸入。」 – djna 2009-09-07 07:23:22

+0

「樂觀鎖定」和好點:-)謝謝。答案已更新。 – 2009-09-07 07:52:25

0

我同意你說樂觀鎖定不是那種用戶友好的。

對於悲觀鎖,我認爲你可以克服這個問題:

  • 爲了更頻繁地釋放鎖,你可以使用一個德來的鎖,在你的數據庫。在delai過期後,另一個用戶可能會打破這個鎖定。第一個用戶會收到通知。這需要從一開始就清楚。

  • 您也可以在鎖定頁面中使用循環自動刷新。在每個(阿賈克斯)請求,你記住時間。因此,如果在服務器上,鎖定比刷新率舊,這意味着用戶不在此頁面上了。所以即使會話沒有過期,您也可以清除鎖定。

0

您可以通過檢索修改的記錄並顯示與他們提交的數據的比較來使樂觀鎖定用戶更加友好。

您可以進一步實施類似TortoiseSVN的界面來編輯衝突(如果有的話)。

這可能需要一點用戶界面的努力,但它會產生一個允許併發編輯的好方法。

您可能想要查看Rietveld中使用的HTML/JS/CSS代碼,作爲如何創建nice diff interface的示例。