謝謝你描述的是標準的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
將添加型rowversion
的RowUpdateTimeStamp
列表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 editing或afterSubmit
form editing修改網格的RowVersion
列與從服務器返回的值。
如果服務器收到來自客戶端的修改請求,它總是修改行的RowVersion
。服務器代碼驗證數據庫中的相應數據在 RowUpdateTimeStamp
列中是否具有較小或相等的值。它的數據庫有較高的值,然後另一個用戶已經修改了數據。在服務器返回帶有一些錯誤HTTP代碼(> = 300)的HTTP響應的情況下。 jqGrid將響應解釋爲錯誤並顯示相應的錯誤消息。可以使用errorTextFormat或errorfunc來自定義錯誤消息。
我在所有生產實施中使用上述方法。您可以在the old answer中閱讀有關該主題的其他信息。
非常感謝。下面是另一個小問題。如果您回答,我將不勝感激。 – 2013-03-22 16:25:21
@Altan Alansu:如果您有其他問題,請發佈新問題或編輯現有問題。 – BoltClock 2013-03-22 18:44:46