数据库同步之事务

      之前在介绍数据库同步的时候仅提供了两种方法,一个是数据库自带的复制技术还有一个是利用WINFORM应用程序实现同步,其实除了这两种方法还有很多其他的方法,比如说镜像,事务日志传送,分布式事务等等,其实镜像好像在SQL2000中没有找到,那就看看SQL2000中提供的两种和事务相关的同步技术,事务日志和分布式事务服务

      ①:事务日志:可能很多数据库的同步功能都基于了事务日志来实现的,因为对主服务器中的数据库不会产生任何的影响。

      主要实现思想:在主服务器上建立一个主服务器和备份服务器都可以访问到的共享文件夹,然后将主服务器的数据库备份文件.bak备份到这个文件夹中,备份服务器还原这个备份文件到备份服务器上的数据库,这样就可以实现主服务器和备份服务器之间的同步了。在这个过程中可能需要建立的作业包括备份作业,还原作业,具体的步骤可以参看这里http://www.csharpwin.com/csharpspace/729.shtml。一旦涉及到作业就会出现实时性的问题,在一些情况下这种‘时差’是不允许的。而且实现感觉也挺复杂的,所以重新考虑了一下分布式事务可否在实时性上有所突破

     ②:分布式事务:首先为主服务器建立链接服务器(也就是建立起和备份服务器之间的关系)。

     (1):建立链接,如果已经存在链接删除重新建立链接

--查看数据库是否已经存在链接
declare @serverName varchar(30)
set @serverName='备份服务器机器名'
if exists(select 1 from master.dbo.sysservers where srvname=@serverName)
begin
  
exec sp_dropserver @serverName,'droplogins'
end

     (2):建立新的链接(建立之前保证服务Distributed Transaction Coordinator是启动的。)

exec sp_addlinkedserver '链接前缀名称(可随便起,以后要用)','','SQLOLEDB','备份服务器机器名'
exec sp_addlinkedsrvlogin '链接前缀名','false',null,'数据库登录名(sa)','数据库登录密码(123456)'

      如果实现主、副服务器数据库的实时同步,最容易想到的方法就是建立触发器。在主服务器的数据库表中建立触发器。

CREATE trigger dbo.DispatherData_insert on dbo.DispatherData after insert
as
begin
  
declare @date nvarchar(20)
  
set @date = convert(nvarchar(20),getdate(),120)
  
set  XACT_ABORT on --需要加上
  
insert into 链接前缀名称.数据库名称.dbo.表名 values (....)
end

     在第二步建立完链接后需要验证链接是否成功,可以利用一个查询语句查看

select * from 链接前缀名称.数据库名称.dbo.表名

     可以往往单独运行类型的CRUD语句没有问题,如果放在触发器或是存储过程中就出现如下的提示问题:该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。这个时候可以到进行如下的设置,控制面板—>管理工具—>组件服务,在打开的组件服务对话框中,展开组件服务—>计算机—>我的电脑,右击属性,选择MSDTC选项卡,点击其中的安全设置,设置以后的效果图如下:

     

      OK!完成了,这时候就可以实现主、副服务器的同步了。

posted @ 2011-05-10 17:46  勇者归来  阅读(372)  评论(0编辑  收藏  举报