我使用的是 SQL Server 2005 标准版。我有一个主数据库和一个只读副本,其中配置了事务复制。我的理解是,使用事务复制时,“INSERT”语句直到
- 该行被插入到主行中,并且
- 该行已完全复制到副本数据库
但是,我遇到了一个问题,我们执行插入时,它会返回(我知道这是因为我正在使用标识 PK 列,并且我有我的 ID 值)。然后我在副本数据库上运行 SELECT 语句,尝试通过 ID 查找行,但它尚不存在。如果我再等几秒钟,一切都会好起来。我对事务复制的理解是否不正确?有没有办法让它按照我的想法工作?
答案1
你的理解是错误的。
事务复制在发布数据库上提交的事务和应用于订阅数据库之间的事务可能会有相当大的延迟。
首先,已提交事务的日志记录从发布数据库的事务日志中收集(由日志读取器代理作业)并(基本上)放入分发数据库。然后,分发代理作业将更改从分发数据库推送或拉取到订阅数据库。
根据这 3 台机器上的工作负载(如果它们是分开的)以及它们之间的网络带宽,延迟可能是几秒、几分钟甚至更长时间。
您正在考虑同步数据库镜像 - 事务无法在主数据库上提交,直到其所有日志记录都已在镜像数据库的日志驱动器上得到强化。事务复制是一个异步过程,并且完全按照其应有的方式运行。
希望这可以帮助。
答案2
我认为您期望复制具有同步(镜像)行为。
复制行为是异步的,您的订阅者可能不会立即看到更改。
看:http://msdn.microsoft.com/en-us/library/ms151706.aspx
编辑:具体来说,该文档讨论的是在某些配置下实现最佳的最小延迟,而不是同步提交。