SQL Server 2008对等复制中冲突检测的应用
内容提示:数据库复制时企业级数据库应用中必须要实现的一个问题。不过可惜的是,到现在不少品牌的数据库解决方案仍然有不少的漏洞。在微软的SQLServer2008数据库中对此做了不少的改善。如在2008的版本中,就实现了在数据库同步功能中检测冲突。
一、SQL Server对等复制冲突产生的原因
【IT专家网】在单个数据库环境下,不同应用程序对于同一张表中的同一条记录进行更改一般不会产生冲突。这主要是因为在数据库中已经实现了锁的机制,来避免这种冲突的产生。但是在异步分布式数据库环境中,每个事务独立作用于每个节点。最要命的是,在2008之前,没有用来跨越多个节点对事务进行序列化的机制。在以前的数据库版本中,主要是通过使用连阶段提交等控制机制,来避免这种冲突。但是这种机制并不是很好,因为其会影响到数据库的性能。
如上图所示,某个集团有三个服务器用来做OA系统的服务器,分别部署在三个不同的分支机构。此时,有可能A服务器所在的公司往用户表中插入一条记录,其员工编号为PR010;同时B服务器所在公司也同时往用户表中插入一条记录,员工编号也为PR010。而这个员工编号的字段在表中设置为关键字。此时就会出现冲突。在对等复制服务器中,在单个对等节点(如服务器A)上提交更改之后将检测不到冲突。但是,在复制这些更改并将其应用于其它对等节点之后(如A服务器中的数据复制到集团服务器,然后集团服务器再将其应用与服务器B),才能够检测到这些更改。在2008版本以前的数据库中,针对这种情况没有很好的处理机制。而在2008版本中则提出了一种全新的“冲突检测机制”,用来解决这个问题。
这个冲突检测机制的工作原理还是比较简单的。在对等复制中,用来将更改应用于每个节点的存储过程会基于每个已发布表中的某个隐藏列来检测冲突。这个隐藏列所存储的ID将为每个节点指定的发起方ID与行版本结合起来,实现冲突检测。在同步期间,分发代理会针对每个表执行同步过程。这些过程会应用来自其他对等节点的插入、更新和删除操作。如果某个过程在读取该隐藏列的值时检测到冲突,则数据库就会报错。通常情况下,如果发生这个冲突导致数据库错误,数据库分发代理会停止向这个节点应用所做的更改。