事务复制中的msrepl_ccs
在事务复制里,如果一个article被更新,distributionagent会调用相应的存储过程将数据更新到订阅端。 这些存储过程分别是[sp_MSins_dboTableName],[sp_MSdel_dboTableName]和 [sp_MSupd_dboTableName], 分别对应插入,删除和更新操作。这些存储过程是在快照初始化时创建的。不过您可能曾经观察到还有其它两个存储过程被调用过:sp_MSins_dboTableName_msrepl_ccs,sp_MSdel_dboTableName_msrepl_ccs。
那么两个存储过程的作用是什么呢?
当sp_addpublication 的参数sync_method值为concurrent时,生成快照时article是允许被更新的,这些更新随后也会被应用到订阅端。 如果是使用默认的命令去更新,那么就可能遇到下面的情况:
假设表ta有2行数据,snapshot agent已经读取第一行和第二行数据,这时插入了第三条数据。接下来snapshot会去读第三条数据,并将三行数据打包到bcp文件中。而第三条数据的日志也会被logreader传递到分发。 这样就会产生一个问题:如果仍然使用sp_MSins_dboTableName,就会造成主键冲突,出现1033错误:Violation of %ls constraint '%.*ls'. Cannot insert duplicate key in object '%.*ls'. The duplicate key value is %ls.
为了避免这种情况,设计出了另外两种存储过程(存储过程的定义请见文章结尾):
当操作是更新时,先判断改行是否存在,如果存在,则使用更新操作。
如果是删除操作,即使影响行为0,也不会抛出20598错误The row was not found at the Subscriber when applying the replicated command。
如果是更新操作,则会先调用css的删除操作,然后调用css的插入命令,以避免20598错误。
所以在初始化的阶段,你会看到多出了两种存储过程。不过在初始化完成后,这两个存储过程就会从订阅段删除掉。
下面列出了三个命令的调用截图。 请注意,这类msrepl_ccs的类型有别于普通的存储过程,其值为-2147483618。
插入操作。sp_MSins_dboTableName会被解释成sp_MSins_dboTableName_msrepl_ccs。
更新操作。sp_MSupd_dboTableName会分解为两个操作,现将数据删除,然后插入新的数据。
删除操作。sp_MSdel_dboTableName会被解释成sp_MSdel_dboTableName_msrepl_ccs。
存储过程的定义
create procedure [dbo].[sp_MSins_dbota_msrepl_ccs]
@c1 int,
@c2 int
as
begin
if exists (select *
from [dbo].[ta]
where [id] = @c1)---------在普通的存储过程中,是没有这段判断逻辑的。
begin
update [dbo].[ta] set
[c] = @c2
where [id] = @c1
end
else
begin
insert into [dbo].[ta](
[id],
[c]
) values (
@c1,
@c2 )
end
end
go
create procedure [dbo].[sp_MSdel_dbota_msrepl_ccs]
@pkc1 int
as
begin
delete [dbo].[ta]
where [id] = @pkc1
---------在普通的存储过程中,还有一段额外的逻辑: 如果影响行为0,则抛出异常。
end
go
一段删除的记录
事务复制中的msrepl_ccs的更多相关文章
- 事务复制中的snapshot
Snapshot agent读取article的信息,将article的内容和脚本放置到snapshot文件夹中: 接下来distribution agent会读取这些快照文件,传输到订阅,完 ...
- 解决服务器复制中SID冲突问题
解决服务器复制中SID冲突问题 如果你有多部的主机需要安装,最快的方法是什么?想必就是用像GHOST之类的软件来进行硬盘的复制.当然,如果是安装在虚拟机之中,则需要复制虚拟的硬盘档案即可,以微软的VP ...
- MySQL主从复制中replicate-ignore-db replicate-wild-ignore-table的应用
MySQL主从复制中replicate-ignore-db replicate-wild-ignore-table的应用 replicate-ignore-dbreplicate-wild-ignor ...
- Spring 下默认事务机制中@Transactional 无效的原因
Spring中 @Transactional 注解的限制1. 同一个类中, 一个nan-transactional的方法去调用transactional的方法, 事务会失效 If you use (d ...
- 复制中的NOT FOR REPLICATION
错误#1 10:51 2012-9-4sp_MSget_repl_commands 重复键插入解答#1 修改distribution库下sp_MSget_repl_commands 存储过程decla ...
- MySQL复制中slave延迟监控
在MySQL复制环境中,我们通常只根据 Seconds_Behind_Master 的值来判断SLAVE的延迟.这么做大部分情况下尚可接受,但并不够准确,而应该考虑更多因素. 首先,我们先看下SLAV ...
- 关于MySQL主从复制中UUID的警告信息
日期: 2014年5月23日 博客: 铁锚 最近在查看MariaDB主从复制服务器 Master 的错误日志时看到很多条警告信息,都是提示 UUID()函数不安全,可能 Slave 产生的值和 Mas ...
- 事务复制5: Transaction and Command
事务复制使用 dbo.msrepl_transactions 和 dbo.MSrepl_commands 存储用于数据同步的Transaction和Command.在replication中,每个co ...
- SQLServer复制(二)--事务代理作业
之前的一篇已经介绍了如何配置复制,介绍了发布者.分发者和订阅者以及事务日志运行的简单关系.其中提到了复制代理,我们这篇将详细介绍复制代理,它是什么?在事务复制的步骤中起到了什么作用? 代理和工作 首先 ...
随机推荐
- CSS入门级学习
css入门学习1:认识CSS 1.1:css简介,css全称是层叠样式表,Cascading style sheets 1.2:css的作用,主要是用于定义html内容在浏览器内的显示样式,如文字大小 ...
- Spring简介和基础
Spring介绍 1.什么事Spring? spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架. spring的设计模式是单例模式和工厂模式. 2.spring的四大优点 轻量 ...
- Android图片处理-图片压缩处理
这里先重复温习一下上一篇,调用相册获取图片: /*** * 这个是调用android内置的intent,来过滤图片文件 ,同时也可以过滤其他的 */ Intent intent = new Inten ...
- Windows Server 2016软件定义存储:Storage Spaces Direct的关键特性
[TechTarget中国原创] 微软在Windows Server 2016 Technical Preview 2中引入了Storage Spaces Direct.这个特性将本地存储扩展为高可用 ...
- 通过boundingRectWithSize:options:attributes:context:计算文本尺寸
转:http://blog.csdn.net/iunion/article/details/12185077 之前用Text Kit写Reader的时候,在分页时要计算一段文本的尺寸大小,之前使用 ...
- 在 Xen 虚拟机下修改系统当前时间
在 Xen 虚拟机下修改系统当前时间 Xen 虚拟机默认不允许不同的虚拟机使用不同的系统时间,因此所有虚拟机的系统时间都会同宿主机的系统时间严格同步,用 date 命令修改虚拟机系统时间时虽然提示成功 ...
- 翻译:使用tbb实现特征检测的例子
A feature-detection example using the Intel® Threading Building Blocks flow graph By Michael V. (Int ...
- 【组合数学+动态规划】在如下8*6的矩阵中,请计算从A移动到B一共有____种走法。要求每次只能向上或向右移动一格,并且不能经过P。
在如下8*6的矩阵中,请计算从A移动到B一共有__种走法.要求每次只能向上或向右移动一格,并且不能经过P. A:456 B:492 C:568 D:626 E:680 F:702 解析: 8*6的矩阵 ...
- Scala 深入浅出实战经典 第46讲: ClassTag 、Manifest、ClasMainifest TagType实战
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- phpMyAdmin在Mac OS X上的配置和使用
本文主要记录phpMyAdmin在Mac OS X上的配置和使用,避免朋友们走弯路,浪费不必要的时间. 1. 下载: 2. 在"设置"中打开" web shar ...