在更改服务器数据库时更新客户端

时间:2012-02-19 17:09:07

标签: database visual-studio sql-server-2008 networking

我在VS + SQL Server 2008上创建了一个程序,并在通过LAN连接的3台计算机的家庭网络上启动了该程序,该程序从数据库中获取数据并将其放入数据集中,因此用户将处理数据集和任何更新,删除或添加数据集将更新数据库。 数据库位于PC(服务器)之一,该服务器也运行相同的应用程序,其他两台PC只是客户端,并从服务器数据库中获取数据。

我的问题是,当一台PC更新数据库时,其他PC不知道该更新,例如,如果一个用户删除一个项目而另一个用户删除相同的项目..这将导致错误。

我的问题很明显:如何通过数据库中的任何更改来更新所有PC?

最后一件事,每个App只与服务器上的SQL服务器数据库对话,不与其他PC上的其他应用程序通信。

1 个答案:

答案 0 :(得分:1)

这是一个常见的问题,通常通过乐观并发检查来处理(这些天) - 基本上,让用户尝试删除/更新,但在行过期时失败。

乐观并发的基本模式是每行都有rowversion列。在执行UPDATE之前,将内存中的rowversion与服务器rowversion进行比较。如果它们不匹配,那么您知道其他人已经更新了行并且需要重新加载。对于DELETE,我个人只会默默地失败DELETE - 毕竟,如果用户想要删除一行,那么事先删除它真的很重要吗?

另一种模式是悲观的,它基本上锁定了行,而任何用户都在使用它。这有明显的服务器资源缺点,用户离开机器等等,但可以使用SQL Server锁定(例如,FOR UPDATE,事务)或应用程序级锁定(例如,检查共享)来实现数据库表)。

使用MS SQL Server,您还有另一个简单的选项 - SqlDependency。这允许SQL Server在查询结果发生变化时(通过事件处理程序)通知您 - 此时您可以重新加载数据。您可以想象,这需要一些服务器资源 - 但由于您只有三个没有中间层的客户端,因此它应该是理想的。