2010-01-15 59 views
4

我的web应用程序对SQL Server 2008使用ADO.NET。数据库写入是针对主(发布程序)数据库发生的,但读取在主要和次要(订户)数据库。我们使用SQL Server的内置事务复制来保持次级最新。大多数情况下,几秒钟的延迟时间不成问题。等待ADO.NET或TSQL中的事务复制

但是,我确实有一个情况,我想阻止该事务在辅助站点上提交。阻塞几秒钟即可,但是向用户返回一个陈旧的页面不是。 ADO.NET或TSQL中是否有任何方法来指定我想等待复制完成?或者,我可以从发行商处检查事务的复制状态,而无需手动连接到辅助服务器。

99.9%的时间,订户中的数据“足够新鲜”。但有一项操作使其无效。我无法从出版商那里了解到每次都有可能失效。如果我在事务复制下无法解决这个问题,您能否提出一个备用架构?

回答

2

有没有这样的SQL Server解决方案,但这是我在其他环境中解决它的方式。在您的应用程序

使用三个独立的连接字符串,并选择基于查询的需要是正确的:

  • 实时 - 直接指向一个主服务器。所有写入到这个连接字符串,并且只有最关键的任务读取到这里。
  • 近实时 - 在负载均衡的用户池中的点数。没有写入这里,只读。用于绝大多数OLTP读取。
  • 延迟报告 - 现在在您的环境中,它将指向相同的负载平衡用户池,但您可以使用类似日志传送技术的服务器拥有8-24小时的服务器池。这些扩展非常好,但数据远远落后。这对报告,搜索,长期历史记录和其他非实时需求非常有用。

如果您从一开始就将应用程序设计为使用这3个连接字符串,缩放比较容易,特别是在遇到这种情况时。

+0

非常感谢。我大概认为这是我们需要做的,但很高兴得到确认。 – solublefish 2010-01-24 20:18:36

0

您正在描述同步镜像情况。根据定义,复制不能支持您的需求。复制必须在从日志中读取并将其交付给分发服务器并从订阅服务器传输到订阅服务器之前等待事务提交,这意味着根据定义进行复制具有数据不同步的机会窗口。

如果您有要求阅读授权数据副本的操作,那么您应该在客户端做出决定,并确保您在该情况下从发布者那里读取数据。

虽然您可以在确认某个交易是否已分配给订户时进行验证,但您不应将其设计基于此。事务复制无法保证延迟,因此您无法依赖“完美的一天”操作模式。

+0

感谢您的意见。请参阅编辑。 – solublefish 2010-01-16 21:12:07