我将在同一网络上运行多台计算机,并运行相同的C#应用程序,并连接到SQL数据库。
我想知道是否需要使用服务代理来确保如果我更新机器1上的表B中的记录A,则更改将推送到计算机2.我已经看到需要使用消息服务器来完成此操作的应用程序之前,我想知道为什么这是必要的,当然如果他们连接到同一个数据库,一台机器的任何更改都会反映在另一台机器上?
谢谢:)
答案 0 :(得分:1)
这主要是关于一致性和延迟。
如果你的应用程序总是在数据库上执行原子操作,并且它们总是在没有缓存的情况下读取所需内容,那么一切都将是一致的。
在实践中,这种情况很少发生。有很多隐藏的缓存机会,比如当你有一个编辑表单时 - 它具有实体在你开始编辑过程之前的价值,但是如果有人在同一时间修改了这些值呢?您只需使用数据重写更改。
解决这个问题是一堆架构决策。不同的场景需要不同的方法。
在数据库中提交数据后,阅读它的每个人都会看到同样的事情 - 但只有当他们真正开始阅读它时,这两个读取才会被另一个提交分开。
更新通知主要涉及使缓存无效,也许还有一些推送式处理(例如,IM客户端可能会向您显示弹出窗口,说明您收到了新消息)。但是,SQL Server通知不可靠 - 无法保证您将收到通知,甚至更少,以便您及时获得通知。这意味着为了确保一致性,您不能依赖缓存的数据,并且必须偶尔强制一次无效,即使您没有收到更改通知。
请记住,即使您实际使用的数据库与ACID足够接近,它通常也不是默认设置(主要是针对性能和可用性)。您需要了解您将获得什么样的保证,以及如何编写代码来处理此问题。如果您的应用程序引入了这些不一致性,即使是最完美的ACID数据库也无法帮助您保持一致性。