2013-07-23 100 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