2013-03-10 78 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