一、环境说明: 
挑选两台不同系统的电脑测试(XP、Win7、Server2008、Server2003全可)。本例环境如下 

本地系统-Win7,数据库名称localTest,IP为192.168.0.102 
远端系统-XP,数据库名称Test131,IP为192.168.57.131 

二、存储过程 
创建表 

Sql代码  收藏代码
  1. USE [localTest]  
  2. GO  
  3. /****** Object:  Table [dbo].[City]    Script Date: 06/26/2011 19:37:49 ******/  
  4. SET ANSI_NULLS ON  
  5. GO  
  6. SET QUOTED_IDENTIFIER ON  
  7. GO  
  8. CREATE TABLE [dbo].[City](  
  9.     [CityID] [int] IDENTITY(1,1) NOT NULL,  
  10.     [ProvinceID] [intNOT NULL,  
  11.     [CityName] [nvarchar](50) NULL,  
  12.  CONSTRAINT [PK_City] PRIMARY KEY CLUSTERED   
  13. (  
  14.     [CityID] ASC  
  15. )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ONON [PRIMARY]  
  16. ON [PRIMARY]  
  17. GO  


存储过程 

Sql代码  收藏代码
  1. USE [localTest]  
  2. GO  
  3. SET ANSI_NULLS ON  
  4. GO  
  5. SET QUOTED_IDENTIFIER ON  
  6. GO  
  7. -- =============================================  
  8. -- Author:      牛金明  
  9. -- Create date: 2011-6-26  
  10. -- Description: LinkServerTest  
  11. -- =============================================  
  12. CREATE PROCEDURE [dbo].[LinkServerTest]   
  13.     @prinvinceID int,  
  14.     @cityName nvarchar(50)  
  15. AS  
  16. BEGIN  
  17.       
  18.     SET NOCOUNT ON;  
  19.     --返回执行结果成功与否,0失败 1成功  
  20.     declare @result int ;  
  21.       
  22.     --解决“无法在此会话中启动更多的事务”错误提示  
  23.     set xact_abort ON  
  24.       
  25.     --使用distributed开启分布式事务  
  26.     begin  distributed tran  t  
  27.       
  28.     begin try  
  29.         --插入远端数据库一条数据  
  30.         insert into SV131.Test131.dbo.city(ProvinceID,CityName)   
  31.             values(@prinvinceID,@cityName);  
  32.               
  33.         --此时向本地数据库插入一条数据  
  34.         insert into City values(@prinvinceID,@cityName);  
  35.         --此条代替向本地数据库插入的一条数据(上面这条数据),用于测试回滚  
  36.         --insert into City values(1111111111111111111111111111,@cityName);  
  37.           
  38.         --提交事务  
  39.         COMMIT tran t;  
  40.           
  41.         set @result = 1;  
  42.     end try  
  43.     begin catch  
  44.         --回滚事务  
  45.         rollback tran t;  
  46.         set @result = 0;  
  47.     end catch  
  48.       
  49.     --查询两个数据表  
  50.     select * from   SV131.Test131.dbo.city  
  51.     select * from   city  
  52.       
  53.     --删除数据表数据  
  54.     delete from SV131.Test131.dbo.city  
  55.     delete from city  
  56.       
  57.     --返回结果  
  58.     return @result;  
  59. END  
  60.   
  61. --可以使用sql代码创建链接服务器的方法  
  62. --EXEC sp_addlinkedserver  'SV131',  N'','SQLOLEDB','192.168.57.131';  
  63. --exec sp_addlinkedsrvlogin  'SV131', 'false',null, 'sa', 'njm'   
  64.   
  65. --查询链接服务器信息  
  66. --select * from sys.servers  
  67. --删除链接服务器  
  68. --sp_dropserver 'SV131','droplogins'  
  69.   
  70. --执行存储过程  
  71. --USE [localTest]  
  72. --GO  
  73. --DECLARE   @return_value int  
  74.   
  75. --EXEC  @return_value = [dbo].[LinkServerTest]  
  76. --      @prinvinceID = 11,  
  77. --      @cityName = N'22'  
  78.   
  79. --SELECT    'Return Value' = @return_value  
  80. --GO  



三、配置图解 
本地Win7-链接服务器设置 

 










本地Win7-DTC设置 

 


 




本地Win7-hosts文件设置 
两台机子不在同一个网段内。必须保证可以ping通机子名称,而非机子的IP,因此在hosts文件中添加映射。 
 

远端XP-链接服务器设置 

 


 


 


 

四、可能会出现的问题 
1、不同网段没有hosts文件的映射 

 

2、事务开始前缺少此句set xact_abort ON 



五、总结 
1、整个的配置过程不会超过5分钟,但是缺少某个环节都会导致出现不易理解的错误出现。 

2、配置DTC可以使用mssql的界面管理器,也可以书写sql代码建立,结果是一样的。 

3、两台电脑必须开启MSDTC服务(Distributed Transaction Coordinator)。另外远端电脑还要开放135端口,对应RPC(Remote Procedure Call)服务,这个服务默认是开户的,但要检查是不是被防火墙拦截了(可考虑关闭防火墙或是将RPC设为例外)。 

4、事务开启前使用set xact_abort ON此句。 

5、事务开启使用begin  distributed tran  t(非传统的begin tran  t)。

转载自:http://njm.iteye.com/blog/1105534