SQLServer 可更新订阅数据冲突的一个原因

可更新订阅为什么有冲突?

可更新订阅中,当升级增加一个字段时,通常在发布服务器的发布数据库中增加,对表增加字段后,发布自动同步到订阅数据库中(复制架构更改=true)。但是,如果此时在订阅数据库进行DML操作,数据将不会同步到发布表中;这些差异数据在订阅表中如果一直未进行DML 操作,也就不会再次同步到发布中,存在差异。

复制配置环境:

可更新订阅事务复制

发布和订阅冲突都以订阅为准

使用排队更新

在订阅操作

冲突测试结果(以下为: 当数据存在不一致的情况下,对订阅再次操作会引起冲突,冲突策略会自动解决):

当发布数据不存在,订阅数据存在时,此时更新订阅数据:(排队更新冲突)

当发布和订阅主键相同,msrepl_tran_version不同时,此时更新订阅数据:(排队更新冲突)

以上两种情况结果:

在发布冲突,冲突表记录值都为最新值,订阅数据更新或插入到发布表中。

当发布数据不存在,订阅数据存在时,此时删除订阅数据:(排队更新冲突)

当发布和订阅主键相同,msrepl_tran_version不同时,此时删除订阅数据:(排队更新冲突)

以上两种情况结果:

删除操作同步到发布时冲突。

 

冲突入选方:

此行不再存在于“[dbo].[TestTab]”中。 [[dbo].[TestTab]].[qcfttabrowid] 中唯一 ID 的值是“8d335a44-36a0-432c-bba4-4979df3c804e”。

冲突落选方:

尝试删除此位置上的此数据时出现上述错误,原因可能是此删除操作违反了一个或多个约束。如果您忽略此冲突,则应通过其他方式加以解决。您可以记录此冲突的详细信息,然后将日志条目发送给系统管理员。

架构更如何防止冲突?

若要在支持更新订阅的发布中的表上进行架构更改,必须在发布服务器和订阅服务器中停止该表上的所有活动,还必须将挂起的数据更改传播到所有节点,然后才能进行架构更改。这可以确保未完成的事务不会与挂起的架构更改发生冲突。架构更改传播到所有节点后,可以在已发布的表上恢复活动。如何停止复制拓扑(复制 Transact-SQL
编程)

参考: 事务复制的可更新订阅

时间: 2024-11-05 19:44:48

SQLServer 可更新订阅数据冲突的一个原因的相关文章

SqlServer 可更新订阅升级字段队列数据丢失原因

原文:SqlServer 可更新订阅升级字段队列数据丢失原因 之前简单描述过数据冲突发生的原因:SQLServer可更新订阅数据冲突的一个原因 ,但具体内部原理是怎么丢失的还不清楚,今天补充说明.可更新订阅,在订阅数据库操作数据,数据实时同步到发布数据库中. 经测试,有3种情况会导致订阅队列的数据丢失: 1.更改字段类型 2.增加删除字段 3.表对象发布 另:添加默认值约束,存储过程,函数正常!订阅队列数据不丢失!(触发器未设置同步) 具体模拟步骤如下: 1.在发布中添加表 2.停止队列读取器代

SQLServer 可更新订阅数据在线架构更改(增加字段)方案

之前一直查找冲突发布和订阅数据不一致的原因,后来发现多少数据库升级引起,因为一直以来都是在发布数据库增加字段,订阅也会自动同步.在此时如果订阅队列有数据,这些数据将丢失.参考上一篇说明:SQLServer 可更新订阅数据冲突的一个原因 .当在发布数据库增加一个字段时,系统同步存储过程和触发器都会重新生成,这会导致仍在队列中的数据无法正常同步.订阅队列中的命令将因"同步"后消失,代理有可能出错,但也会自动回复正常!~ 这周测试了一些方法,最终算是确定一个方案可行的,虽然麻烦和耗时. 首先

SqlServer 可更新订阅队列读取器代理错误:试图进行的插入或更新已失败

原文:SqlServer 可更新订阅队列读取器代理错误:试图进行的插入或更新已失败 今天发现队列读取器代理不停地尝试启动但总是出错: 其中内容如下: 队列读取器代理在连接"PublicationServer"上的"pubDB"时遇到错误"试图进行的插入或更新已失败, 原因是目标视图或者目标视图所跨越的某一视图指定了 WITH CHECK OPTION, 而该操作的一个或多个结果行又不符合 CHECK OPTION 约束.". 请确保正确定义了分发

SqlServer 可更新订阅中在订阅库并发获取最大单据号测试及解决法案!

说明: 很多交易的系统都需要单据号,而单据号按顺序并发获取又是一件头疼的事!~ 一般单据号格式为:前缀+日期+编号(如:KK20150501000001) 现在模拟测试,数据库中的单据号作为一张表处理. 数据库单据号表(Billnumber)存储每个账号及其最大的单据号总共一条记录 单据号是组合而成的字符串,后6位为序号. 获取单据号的存储过程: EXEC [dbo].[GetBillnumber_Test]@Account='Account',@Billnumber NVARCHAR(20)O

SqlServer 使用脚本创建分发服务及事务复制的可更新订阅

[创建使用本地分发服务器] /************************[使用本地分发服务器配置发布]***********************/ -- SqlServer 2008 R2 -- https://technet.microsoft.com/zh-cn/library/ms151860(v=sql.105).aspx use master go -- 服务器上是否已安装分发服务器 -- https://msdn.microsoft.com/zh-cn/library/ms

SqlServer & Windows 可更新订阅立即更新启用分布式事务协调器(MSDTC)

原文:SqlServer & Windows 可更新订阅立即更新启用分布式事务协调器(MSDTC) 在可更新订阅中,在订阅设置更新方法,将 "排队更新" 设置为 "立即更新" 接着在订阅数据库更新表数据,出错: 消息 21079,级别 16,状态 1,过程 sp_getpublisherlink,第 52 行 没有发布服务器的 RPC 安全信息,或该信息无效.请用 sp_link_publication 指定该信息. 消息 20512,级别 16,状态 1,

性能优化——统计信息——SQLServer自动更新和自动创建统计信息选项 (转载)

原文译自:http://www.mssqltips.com/sqlservertip/2766/sql-server-auto-update-and-auto-create-statistics-options/?utm_source=dailynewsletter&utm_medium=email&utm_content=headline&utm_campaign=2012913 统计信息是如何提高SQLServer查询性能的?统计直方图用作在查询执行计划中查询优化器的选择依据.

在windows 2008 R2中SQl Server 2008中代理启动失败的一个原因总结

启动SQL代理的时候报错如下: 关调用实时(JIT)调试而不是此对话框的详细信息,请参见此消息的结尾. ************** 异常文本 **************System.NullReferenceException: 未将对象引用设置到对象的实例. Server stack trace: 在 Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.ObjectExplorer.FindObjectExplore

转载:性能优化——统计信息——SQLServer自动更新和自动创建统计信息选项

这段时间AX查询变得非常慢,每天都有很多锁. 最后发现是数据库统计信息需要更新. ------------------------------------------------------------------------------ 原文译自:http://www.mssqltips.com/sqlservertip/2766/sql-server-auto-update-and-auto-create-statistics-options/?utm_source=dailynewslet