【问题标题】:Automatically refresh a user1's page when user2 updates/adds a record in database当 user2 在数据库中更新/添加记录时自动刷新 user1 的页面
【发布时间】:2020-08-02 18:21:42
【问题描述】:

我正在使用 asp.net、sql server 开发一个简单的 Web 应用程序。 我被困在一个点上,我的要求是当 user2 通过他的页面更新/添加数据库中的记录时自动刷新 user1 的页面。 user1 和 user 2 都在访问同一个表中的记录。 请问这个怎么做?

【问题讨论】:

  • 即使在桌面上,这也是个坏主意。但是,用户是否正在编辑数据,比如一条记录,并且他们想查看其他用户的日期更新?或者你在谈论某种数据网格,用户正在查看这个数据网格,如果其他用户添加了新记录,那么你想看到新行出现吗?这个想法没问题,但它实际上取决于您希望看到其他用户的更新发生的时间/时间/地点。如果您在同时编辑记录时谈论这种情况,那么这充其量是混乱的,我会避免这种设计要求。
  • 如果您只是显示数据,那么您能做的最好的可能就是在页面脚本中使用计时器来定期进行 AJAX 调用以检查任何更改并相应地更新页面。没有浏览器的请求,服务器不能任意通知用户响应。如果他们正在编辑,那么我同意这是一个坏主意,您应该让他们保存,捕获并发异常,向他们展示新数据,然后询问他们如何继续。
  • 不一定是轮询解决方案,@jmcilhinney - 可以轻松使用信号器之类的东西,以便服务器可以通知浏览器,但我知道你的意思你说得对,开发一些试图让一切保持同步的东西是浪费时间。即使是像 stackoverflow 这样大的网站也不会打扰它。他们只是给了一个注释“其他人在你之前编辑了这个问题,你的编辑必须比他们的更实质性”

标签: asp.net vb.net web-applications


【解决方案1】:

正如 jmc 在 cmets 中指出的那样;你没有。您只需跟踪 user1 和 user2 何时认为该行已更改(例如,每个人下载该行的 updatedOn 日期),然后何时由 user2 进行编辑,等待时间过长并且 user1 已经编辑了该行,然后 user2 发出类似UPDATE person SET name = @newname, updatedOn=getUtcDate() WHERE ID =@id and updatedOn = @updatedOnFromBefore的更新

因为每个用户都知道旧的 updatedOn 值,然后 user1 在进行编辑时给出了正确的值,而他的编辑将 updatedOn 值更改为其他值,现在这意味着 user2 尝试编辑 db 将失败,因为该值user2 记得 updatedOn 是错误的。

此时,您现在可以向 user2 显示他们的编辑,您可以查询数据库以获取数据的当前状态,您可以让 user2 选择“拿走他们的,拿走我的或自己手动合并两者”(您可以甚至尝试通过检测谁更改了什么来合并自动,但这更难)。主要的一点是,这并不是要让 100 个人一直在查看数据。它只是在保存时防止版本冲突

这被称为乐观并发,这里作为一个简单的例子让你理解这个过程。像 SQLServer 这样的 DBS 具有执行这种并发管理的特定机制(行版本) - 如果需要,您可以阅读它们,但它以这种基本方式工作;用户2下载的数据的某些部分必须仍然相同才能使编辑成功


如果您正在编写其他一些不断提供实时更新的系统,例如股票交易系统,它可以在价格发生的那一刻保持最新,那么您需要查看诸如 signalR 之类的东西,它允许 JavaScript 应用程序在页面上建立与服务器的永久连接,以便服务器必须提供的任何更新都会立即推送到所有客户端。我绝对不会在乐观并发上使用它来保存数据,但我会使用它来实现聊天室、新闻提要、股票价格等

【讨论】:

  • 谁能给我解释一下“..可以很容易地使用像信号器这样的东西,这样服务器就可以通知浏览器,..”这是什么以及如何在 asp.net 中完成?
猜你喜欢
  • 1970-01-01
  • 2011-10-26
  • 2022-08-18
  • 2013-03-14
  • 2013-10-20
  • 2016-12-24
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
相关资源
最近更新 更多