2013-07-23 99 views
0

我想爲jQGrid編輯實現行鎖定。由於我的後端使用的是JDBC,我正考慮在後端使用樂觀鎖定,並且如果未獲取鎖定,則會在網格上顯示錯誤消息。jQGrid行鎖定編輯

這是做到這一點的最佳方式還是有更好的選擇?是否有可能鎖定網格上的行,使其他用戶(在不同的系統和瀏覽器上)可以在編輯時編輯特定的行?

請幫忙。

謝謝

回答

1

我不是JDBC開發人員。有一些常見的原則可以實現併發控制。其中一種方式是optimistic concurrency control。有很多這種併發的實現例子。

因爲我主要使用Microsoft SQL Server,所以我總是使用二進制時間戳值保存在數據庫的每一行表中。我在每個表格中添加一個不可修飾的rowversion類型的列,它在語義上等同於binary(8)類型。主要優點是一個不需要手動填充列。 SQL Server持有與數據庫關聯的計數器。在任何數據庫表的每一行插入或行更新中,具有rowversion的列都將被分配給計數器的當前值。之後,計數器將增加。順便說一句,有一個「timestemp」的行。如果對該行進行某些修改,則在具有rowversion類型的列中增加了一個值。因此,爲了實現樂觀併發性,只需要擴展每個jqGrid表,並添加一個隱藏列,該列保存rowversion值。如果需要修改數據,我將隱藏的rowversion列的值與修改後的數據一起發送到服務器。修改請求應按照以下方式進行解釋:我得到rowversion值的數據並將其修改爲新值。我的服務器代碼在進行更改之前需要驗證數據庫中的數據內容是否仍對應相同的rowversion值。如果是這樣,那麼其他用戶不會更改數據,並且可以安全地進行修改。如果rowversion的值現在更高,則服務器應返回有關併發錯誤的jqGrid錯誤消息。建議使用當前的數據重新加載網格。

有關實施的更多信息,您可以閱讀the answerthis old one

我不確定您是否可以直接使用上述方法,因爲您使用JDBC,但我認爲實現的主要思想可能是相同的。

+0

非常感謝oleg!但如果我理解正確,這將以下列方式工作:用戶1開始編輯一行。同時,用戶2開始更新同一行,但當用戶2點擊提交時,將顯示錯誤消息。如果希望在用戶2開始進行任何更改之前顯示錯誤消息,該怎麼辦?我希望只要用戶單擊導航欄中的編輯按鈕就會顯示警告。 – AbtPst

+0

@ user2334092:否按以下方式工作:* a)用戶1 **在網格中加載數據**。網格中的數據停留在Web瀏覽器中。 b)稍後,用戶2加載並更改他的計算機上的數據。 c)用戶1開始更改他的Web瀏覽器中的數據並嘗試保存更改。*我知道用戶在Web瀏覽器中打開了許多選項卡(我也這樣做)。所以我可以在標籤中看到相對較舊的數據。如果我開始編輯數據,我並不總是在開始編輯之前重新加載數據。所以描述的情況非常重要,可以很容易地複製。 – Oleg

+0

但用戶2如何知道其他人正在進行更改? – AbtPst