谢谢你描述的是标准的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