3

用户 A 登录工单管理系统以编辑“SomePage.aspx”上的内容

用户 B 在 30 秒后登录以在“SomePage.aspx”上编辑同一张票

通知每个用户其他人正在修改相同内容的一些最佳实践(在 3 层架构中)是什么?

4

5 回答 5

8

在像 HTTP 这样的请求/响应系统中,没有太多关于用户当前正在做什么的概念。您可以通知他们其他人“在最后两分钟内”打开了要编辑的票证(甚至在这种情况下阻止他们打开票证),但用户 A 可以编辑半小时 - 除非您也禁止这样做。您可以记录下您认为用户 A 有效地“获取”了要编辑的项目的事实,但是对于 Web 应用程序,没有什么可以阻止用户离开计算机并且从不保存/取消。

在考虑技术解决方案之前,我建议考虑技术限制(基本上是网络的异步和请求/响应性质)并制定所需的行为。一些常见的行为是:

  • 第一个编辑获胜(告诉第二个编辑他们的更改已被拒绝,基本上)
  • 第二次编辑获胜(覆盖第一次编辑 - 告诉第一个编辑为时已晚)
  • 合并(可能非常困难和/或不可能,具体取决于内容)。这可以是自动的或手动的(在第二个编辑器方面)。
  • 在您认为第一人可能正在编辑时阻止第二人进行编辑(由于第一段中提到的问题,很少适用于网络应用程序)
于 2008-10-24T07:33:41.337 回答
2

Roundup 使用(例如)乐观并发方法:当您提交更改时,您可能会看到有人在您之前进行了更改的警告,并带有指向显示其更改的页面的链接。您可以单击提交以继续进行更改或编辑表单中的值,然后提交。

这适用于票务系统,因为票证上几乎没有共享状态——主要是您附加到消息日志(或等效项),因此 2 条消息一个接一个地添加。

于 2008-10-24T15:04:42.973 回答
1

我在这方面不是很有经验,但如果我需要做类似的事情,我会在 Ticket Table 上的数据库上创建一个名为EditingBy的新字段,并添加一个默认值“0”。

当用户调用 TicketID = 897 时,查询应如下所示:

SELECT * FROM Tickets WHERE TicketID = 897; 
UPDATE Tickets SET EditingBy = @UserID WHERE TicketID = 897;

然后在代码中,您会看到 EditingBy 是否大于 0,您可以警告 UserB UserA(您知道 UserID)正在编辑票证,就像有人发布答案并且您正在写您的答案时那样,或者当您得到一个以新徽章为例。

当提交更新票证时,您可以将该字段更新回 0。

并建议用户可以输入 SomePage.aspx 并离开而不做任何事情,因为 body 标记中的javascript onUnload会触发异步调用以将 EdittingBy 更新回 0 将是一个想法。

希望这能让你对这样做有一个想法。

已编辑: 如果无法编辑数据库本身,您可以随时将 EditingBy 记录在 XML 文件中,只需保留 TicketID 和 UserID,而不是查找它是否大于 0,只需检查 TicketID 是否在 XML 中。

于 2008-10-24T07:40:53.677 回答
1

我发现防止乐观并发的最好方法是在数据库中添加一个名为时间戳的字段,例如:SQLTimeStamp。该字段为表中的每条记录维护一个唯一值。当用户 A 查询表进行编辑时,将 sqltimestamp 值存储在会话中。如果用户 B 在用户 A 之前查询和更新同一条记录,则 sql 时间戳值会更改。如果用户 A 现在尝试存储编辑的值,首先检查会话时间戳是否与数据库上的当前时间戳相同,如果时间戳不同,则提示用户有人修改了记录。

这是我用于 Web 应用程序的解决方案。

于 2011-07-15T12:38:37.670 回答
0

我假设您正在谈论帮助台票或类似的东西,一次只有一个用户应该处理它。在这种情况下,当第一个用户签出票证时,票证的状态应该会改变

于 2008-10-24T07:37:02.547 回答