2013-03-10 75 views
2

我有一個關於Jqgrid行更新的問題。我們有如下的數據庫表。jqGrid行更新

ID:1字段1:約翰場2:黑色

設想一個用戶要更新其中有一個名爲id = 1場的第一排。用戶雙擊該行並打開該行的詳細信息。正如你看到的第一行field1是約翰和field2是黑色的。 如果另一個用戶在第一個用戶之後雙擊同一行並將field2更新爲紅色,會發生什麼情況?第一位用戶仍在更新屏幕上。在他的屏幕上,field2仍然是黑色的。之後,第一個用戶只將field1更新爲插孔並保存該行。結果將是field1:jack,field2:black。因爲第一個用戶不知道field2的變化。並且第二個用戶的field2更改已消失.. 如何防止此示例中的數據丟失?

我更新所有的字段時,用戶雙擊並保存行中的任何改變..提前

回答

2

謝謝你描述的是標準的concurrency control問題。在網絡開發的情況下,通常使用optimistic concurrency control來解決該問題。作爲ASP.NET開發人員,您可能使用Microsoft SQL Server來保存數據。 SQL Server支持非常有用的數據類型rowversion(也稱爲timestamp數據類型)。不可空的rowversion列在語義上等同於binary(8)列。使用rowversion的主要優點是使用簡單。 SQL Server支持與數據庫關聯的內部計數器。該計數器可通過@@DBTS變量訪問。每次當數據庫的表中的一行將被修改時,rowversion列將被自動更改爲@@DBTS的值,並且@@DBTS將被遞增。可以使用額外的rowversion列輕鬆確定自上次讀取以來該行中的任何值是否已更改。

所以,如果你有一個現有的數據庫表,你可以添加一列,其中包含行更新計數器的rowversion(時間戳)。例如,聲明

ALTER TABLE dbo.Users ADD RowUpdateTimeStamp rowversion NOT NULL 

將添加型rowversionRowUpdateTimeStamp列表dbo.Users。如果你創建新用戶的表,你可以這樣做下面

CREATE TABLE dbo.Users (
    Id int NOT NULL IDENTITY, 
    FirstName nvarchar(64) NOT NULL, 
    LastName nvarchar(64) NOT NULL, 
    RowUpdateTimeStamp rowversion NOT NULL, 
    CONSTRAINT PK_Users PRIMARY KEY CLUSTERED (Id ASC), 
    CONSTRAINT UC_Users_LastName_FirstName UNIQUE NONCLUSTERED (LastName ASC, FirstName ASC) 
) 

它創建你所描述的表,但表將有類型rowversion的額外RowUpdateTimeStamp列。再次強調一個人不需要手動保存列中的任何值是很重要的。 SQL Server將自動保存/修改該列的值。

如果您使用表中的數據填充網格,您可以例如在數據庫表的RowUpdateTimeStamp列中包含隱藏的RowVersion列。在colModel的相應列的定義看起來像

name: "RowVersion", sortable: false, hidden: true, hidedlg: true, 
editable: true, editrules: { edithidden: false } 

這意味着從隱藏RowVersion值將與其他可修改列的值一起發送。

修改網格行的服務器方法返回修改後的版本RowUpdateTimeStamp。我使用aftersavefunc回調inline editingafterSubmitform editing修改網格的RowVersion列與從服務器返回的值。

如果服務器收到來自客戶端的修改請求,它總是修改行的RowVersion。服務器代碼驗證數據庫中的相應數據在 RowUpdateTimeStamp列中是否具有較小或相等的值。它的數據庫有較高的值,然後另一個用戶已經修改了數據。在服務器返回帶有一些錯誤HTTP代碼(> = 300)的HTTP響應的情況下。 jqGrid將響應解釋爲錯誤並顯示相應的錯誤消息。可以使用errorTextFormaterrorfunc來自定義錯誤消息。

我在所有生產實施中使用上述方法。您可以在the old answer中閱讀有關該主題的其他信息。

+0

非常感謝。下面是另一個小問題。如果您回答,我將不勝感激。 – 2013-03-22 16:25:21

+0

@Altan Alansu:如果您有其他問題,請發佈新問題或編輯現有問題。 – BoltClock 2013-03-22 18:44:46