二、启用SQL Server对等复制冲突检测机制
通常情况下,如果多个节点服务器同时采取如下操作的话,就容易导致冲突。一是插入-插入冲突。如两个服务器冲突向同一个表中插入数据,而每个表中所有参与对等复制的行都使用某个主键值来进行唯一的标识。此时在将具有相同键值的行插入到多个节点时,就会发生插入-插入冲突。二是更新-更新冲突。如上图所示,服务器A与服务器B同时对某个表中相同的行进行更新,此时就会发生更新-更新冲突。与此类似,另外还可能发生插入-更细冲突、插入-删除冲突、更新-删除冲突、删除-删除冲突等等。在数据库设计时,如果预计到会发生如上这些冲突时,则就需要考虑启用冲突检测机制。由于默认情况下,可以在任何节点上更改数据,因此如果不采取必要措施的话,在不同节点上进行的数据更改就会发生冲突。如果在多个节点上修改了同一行,则该行传播给其他节点时可能会导致冲突,甚至会丢失更新的数据。有时候,这个后果会很严重。在数据库设计的时候,一定要充分预计到这种情况的产生。如果企业采用的数据库版本是2008的,则可以在各个节点上启用冲突检测机制,让数据库系统自动来检测这种冲突,避免不需要的麻烦。在SQLServer2008的环境下,有很多种方式可以用来启用这个冲突检测机制。
如可以通过存储过程来启用和禁用各个节点的冲突检测机制。在数据库系统中设置了sq_addpublication存储过程,只要管理员需要,就可以通过调用这个存储过程来启用某个节点的冲突检测机制。数据库管理员采用存储过程来启动或者禁止冲突检测机制,还有一个好处。即可以指定在检测到冲突的时候,分发代理是否应当停止应用所做的更改。默认情况下,使会让分发代理停止应用所做的更改。笔者的建议是,如果没有充分的必要,则不要更改这个默认值。
另外,如果数据库管理员不希望使用命令行的方式(即通过调用存储过程的方式)来管理这个冲突检测机制,在还可以通过企业管理器来实现。在“发布属性”的对话框中选择“订阅选项”页签或者通过“对等复制拓扑向导”都可以用来启动或者禁止冲突检测机制。不过采用这种形式来管理冲突检测机制,跟通过存储过程来启用,有一个缺陷。即此时数据库管理员会缺乏一种选择权。因为此时分发代理在检测到有冲突的时候自动停止应用所有的更改。而通过存储过程来启用冲突检测机制时,数据库管理员还可以选择是应用还是放弃。在管理这个冲突检测机制的时候,这一点差异数据库管理员需要心中有数。然后根据自己的需要,来选择合适的管理方式。