`
njmnjx
  • 浏览: 232005 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

链接服务器-分布式事务图解

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

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

二、存储过程
创建表
USE [localTest]
GO
/****** Object:  Table [dbo].[City]    Script Date: 06/26/2011 19:37:49 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[City](
	[CityID] [int] IDENTITY(1,1) NOT NULL,
	[ProvinceID] [int] NOT NULL,
	[CityName] [nvarchar](50) NULL,
 CONSTRAINT [PK_City] PRIMARY KEY CLUSTERED 
(
	[CityID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

存储过程
USE [localTest]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		牛金明
-- Create date: 2011-6-26
-- Description:	LinkServerTest
-- =============================================
CREATE PROCEDURE [dbo].[LinkServerTest] 
	@prinvinceID int,
	@cityName nvarchar(50)
AS
BEGIN
	
	SET NOCOUNT ON;
	--返回执行结果成功与否,0失败 1成功
	declare @result int ;
	
	--解决“无法在此会话中启动更多的事务”错误提示
	set xact_abort ON
	
	--使用distributed开启分布式事务
	begin  distributed tran  t
	
	begin try
		--插入远端数据库一条数据
		insert into SV131.Test131.dbo.city(ProvinceID,CityName) 
			values(@prinvinceID,@cityName);
			
		--此时向本地数据库插入一条数据
		insert into City values(@prinvinceID,@cityName);
		--此条代替向本地数据库插入的一条数据(上面这条数据),用于测试回滚
		--insert into City values(1111111111111111111111111111,@cityName);
		
		--提交事务
		COMMIT tran t;
		
		set @result = 1;
    end try
    begin catch
		--回滚事务
		rollback tran t;
		set @result = 0;
    end catch
    
    --查询两个数据表
    select * from   SV131.Test131.dbo.city
    select * from   city
    
    --删除数据表数据
    delete from SV131.Test131.dbo.city
	delete from city
	
	--返回结果
	return @result;
END

--可以使用sql代码创建链接服务器的方法
--EXEC sp_addlinkedserver  'SV131',  N'','SQLOLEDB','192.168.57.131';
--exec sp_addlinkedsrvlogin  'SV131', 'false',null, 'sa', 'njm' 

--查询链接服务器信息
--select * from sys.servers
--删除链接服务器
--sp_dropserver 'SV131','droplogins'

--执行存储过程
--USE [localTest]
--GO
--DECLARE	@return_value int

--EXEC	@return_value = [dbo].[LinkServerTest]
--		@prinvinceID = 11,
--		@cityName = N'22'

--SELECT	'Return Value' = @return_value
--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)。
  • 大小: 16.6 KB
  • 大小: 75.3 KB
  • 大小: 75.9 KB
  • 大小: 27.6 KB
  • 大小: 21.7 KB
  • 大小: 20.7 KB
  • 大小: 110 KB
  • 大小: 3.1 KB
  • 大小: 19.2 KB
  • 大小: 25 KB
  • 大小: 87.2 KB
  • 大小: 80.9 KB
  • 大小: 18.6 KB
  • 大小: 13.1 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics