SQL Server之分布式事务

转载 2013年12月03日 19:14:18

--> Title  : SQL Server之分布式事务

--> Author : wufeng4552

--> Date   : 2009-11-11

SQL Server之分布式事务

(一)概念:

分布式事务是涉及来自两个或多个源的资源的事务。Microsoft® SQL Server™ 2000支持分布式事务,使用户得以创建事务来更新多个SQL Server数据库和其它数据源。

分布式事务包括:

·资源管理器

控制分布式事务所涉及的每个资源的软件称为资源管理器。分布式事务由各个资源管理器内的本地事务组成。每个资源管理器必须能够与分布式事务内的所有其它资源管理器相协调,以提交或回滚自己的本地事务。SQL Server 可以作为分布式事务内的资源管理器工作,并遵从用于分布式事务处理的 X/Open XA 规范。

·事务管理器

提交或回滚分布式事务由称为事务管理器的软件组件控制。事务管理器与每个资源管理器相协调,确保一起提交或回滚所有组成分布式事务的本地事务。Microsoft分布式事务处理协调器 (MS DTC) 服务如事务管理器一样工作。MS DTC 遵从用于分布式事务处理的 X/Open XA 规范。

·两阶段提交 (2PC)

需要进行特殊的提交处理,以防止在管理跨越多个资源管理器的事务时出现问题。当刷新日志缓冲区使其可用时,提交大事务可能需要相对较长的时间。提交进程本身还可能遇到错误,需要强行回滚。如果事务管理器只是请求每个资源管理器提交,则可能从一些资源管理器返回成功状态,然后从某个资源管理器得到错误信息。这会导致冲突,因为所有分布式事务都应回滚,而部分事务已提交。两阶段提交通过将提交分成两相可以解决此问题:

·准备

事务管理器给每个资源管理器发送一个准备提交的请求。然后,每个资源管理器执行完成提交进程所需的所有大量占用资源的操作,如刷新所有日志缓冲区。资源管理器只保留维护事务完整性所需的最少的锁,然后给事务管理器返回成功状态。

·提交

如果所有资源管理对发给它们的准备请求返回成功状态,事务管理器将给每个资源管理器发送提交命令。然后,每个资源管理器快速将事务记录为已完成,并释放上次控制的资源。如果有任何资源管理器对准备请求返回错误信息,事务管理器将给每个资源管理器发送回滚命令。

有几种方法可以使应用程序在分布式事务内包括 SQL Server 2000:

·如果应用程序有本地事务并且发出分布式查询,本地事务将升级到分布式事务。

·发出 BEGIN DISTRIBUTED TRANSACTION 语句。

·如果应用程序有本地事务并且将 REMOTE_PROC_TRANSACTIONS 选项设置为 ON,则调用远程存储过程将使本地事务升级到分布式事务。

·使用用于 SQL Server 的 OLE DB 提供程序或 SQL Server ODBC 驱动程序的应用程序,可以使用 OLE DB 方法或 ODBC 函数让 SQL Server 连接联接由应用程序启动的分布式事务。

(二)案例

(2.1)問題描述

在执行分布式事务时,在sql server 2005下收到如下错误:

消息 7391,级别 16,状态 2,过程 xxxxx,第 16 行

无法执行该操作,因为链接服务器 "xxxxx" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务。

在sql server 2000下收到如下错误:

该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。

[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]

OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。

(2.2)解決方案

(2.2.1)双方启动MSDTC服务

MSDTC服务提供分布式事务服务,如果要在数据库中使用分布式事务,必须在参与的双方服务器启动MSDTC(Distributed Transaction Coordinator)服务。

(2.2.2) 打开双方135端口

MSDTC服务依赖于RPC(Remote Procedure Call (RPC))服务,RPC使用135端口,保证RPC服务启动,如果服务器有防火墙,保证135端口不被防火墙挡住。使用“telnet IP 135 ”命令测试对方端口是否对外开放。也可用端口扫描软件(比如Advanced Port Scanner)扫描端口以判断端口是否开放。

(2.2.3)保证链接服务器中语句没有访问发起事务服务器的操作

   在发起事务的服务器执行链接服务器上的查询、视图或存储过程中含有访问发起事务服务器的操作,这样的操作叫做环回(loopback),是不被支持的,所以要保证在链接服务器中不存在此类操作。

(2.2.4)在事务开始前加入set xact_abort ON语句

对于大多数 OLE DB 提供程序(包括 SQL Server),必须将隐式或显示事务中的数据修改语句中的 XACT_ABORT 设置为 ON。唯一不需要该选项的情况是在提供程序支持嵌套事务时。

(2.2.5)MSDTC设置

管理工具―组件服务―计算机―我的电脑(右键)―MSDTC―安全配置

在安全配置窗口中做如下设置:

(2.2.5.1)选中“网络DTC访问”

(2.2.5.2)在客户端管理中选中“允许远程客户端”“允许远程管理”

(2.2.5.3)在事务管理通讯中选“允许入站”“允许出站”“不要求进行证” (2.2.5.4)保证DTC登陆账户为:NT   Authority/NetworkService


(2.2.6)链接服务器和名称解析问题

建立链接sql server服务器,通常有两种情况:

第一种情况,产品选”sql server”

     EXEC sp_addlinkedserver

     @server='linkServerName',

     @srvproduct = N'SQL Server'

这种情况@server(linkServerName)就是要链接的sqlserver服务器名或者ip地址。

    第二种情况访问接口选“Microsoft OLE DB Provider Sql Server”或“Sql Native Client”

    EXEC sp_addlinkedserver  

      @server='linkServerName',

      @srvproduct='',

      @provider='SQLNCLI',

      @datasrc='sqlServerName'

这种情况,@datasrc(sqlServerName)就是要链接的实际sqlserver服务器名或者ip地址。

Sql server数据库引擎是通过上面设置的服务器名或者ip地址访问链接服务器,DTC服务只通过服务器名地址访问链接服务器,所以要保证数据库引擎和DTC都能通过服务器名或者ip地址访问到链接服务器。

数据库引擎和DTC解析服务器的方式不太一样,下面分别叙述

数据库引擎

第一种情况的@server或者第二种情况的@datasrc设置为ip地址时,数据库引擎会根据ip地址访问链接服务器,这时不需要做名称解析。

第一种情况的@server或者第二种情况的@datasrc设置为sql server服务器名时,需要做名称解析,就是把服务器名解析为ip地址。

有两个办法解析服务器名:

一是在sql server客户端配置中设置一个别名,将上面的服务器名对应到链接服务器的ip地址。

二是在“C:/WINDOWS/system32/drivers/etc/hosts”文件中增加一条记录:

xxx.xxx.xxx.xxx 服务器名

作用同样是把服务器名对应到链接服务器的ip地址。

DTC

不管哪一种情况,只要@server设置的是服务器名而不是ip地址,就需要进行名称解析,办法同上面第二种办法,在hosts文件中增加解析记录,上面的第一种办法对DTC不起作用。

如果@server设置的是ip地址,同样不需要做域名解析工作

(2.2.7)远程服务器上的名称解析

分布式事务的参与服务器是需要相互访问的,发起查询的服务器要根据机器名或ip查找远程服务器的,同样远程服务器也要查找发起服务器,远程服务器通过发起服务器的机器名查找服务器,所以要保证远程服务器能够通过发起服务器的机器名访问到发起服务器。一般的,两个服务器在同一网段机器名能就行很好的解析,但是也不保证都能很好的解析,所以比较保险的做法是:在远程服务器的在“C:/WINDOWS/system32/drivers/etc/hosts”文件中增加一条记录:xxx.xxx.xxx.xxx    发起服务器名

SQL Server 分布式事务

如果你也遇到了类似于 OLE DB "SQLNCLI" "未知" "分布"等错误时,请现尝试使用这个地址的方法进行处理,如果无效的话在继续后面的方法 http://blog.csdn.net/hb...
  • tianlianchao1982
  • tianlianchao1982
  • 2014年10月31日 15:34
  • 683

SQL Server 2008的分布式事务管理原理

分布式事务跨越两个或多个称为资源管理器的服务器。称为事务管理器的服务器组件必须在资源管理器之间协调事务管理。如果分布式事务由 Microsoft 分布式事务处理协调器 (MS DTC) 之类的事务管理...
  • wangyh_128
  • wangyh_128
  • 2011年03月09日 21:54
  • 644

sql server 连 oracle 'MSDAORA' 无法启动分布式事务

按照MSSQL的在线文档进行配置,在线文档中只列出的 Oracle8.1以下版本的解决方案,但是MSSQL服务器安装的是ORACLE9I的客户端,造成找不到相关文件。解决办法:    若要启用用于 O...
  • qvyyy
  • qvyyy
  • 2007年07月31日 11:28
  • 1999

[SQL Server]嵌套事务与分布式事务

Sql Server支持嵌套事务:也就是说在前一事务未完成之前可启动一个新的事务,只有在外层的Commit Tran语句才会导致数据库的永久更改。请尝试执行以下语句:BEGIN  TRAN  tr0 ...
  • xiaoxu0123
  • xiaoxu0123
  • 2011年07月06日 14:21
  • 1305

SQL Server分布式事务配置(MSDTC)(远程数据库更新)

如果你也遇到了类似于OLE DB "SQLNCLI" "未知" "分布"等错误时,请现尝试使用这个地址的方法进行处理,如果无效的话在继续后面的方法http://blog.csdn.net/hb_gx/...
  • olony
  • olony
  • 2009年01月08日 10:03
  • 10461

SQL Server之分布式事务.

--> Title  : SQL Server之分布式事务 --> Author : wufeng4552 --> Date   : 2009-11-11 SQL Server之分布式事务 (...
  • xiaokuang513204
  • xiaokuang513204
  • 2013年05月02日 09:14
  • 556

sql server分布式事务解决方案

 适用环境操作系统:windows 2003数据库:sql server 2000/sql server 2005使用链接服务器进行远程数据库访问的情况一、 问题现象在执行分布式事务时,在sql se...
  • ljsql
  • ljsql
  • 2007年07月18日 22:11
  • 963

SQLNCLI" 无法启动分布式事务"问题

一、  问题现象 在执行分布式事务时,在sql server 2005下收到如下错误: 消息 7391,级别 16,状态 2,过程 xxxxx,第 16 行 无法执行该操作,因为链接服务器 "x...
  • dreamyuzhou
  • dreamyuzhou
  • 2011年11月16日 13:35
  • 1387

sqlserver 2000中执行分布式事务的步骤

借助网上资料的帮助,终于解决了这个问题,不容易啊。总结一下。(所有操作都在xp服务器上执行)运行环境:一台运行在Xp下的sqlserver 2000服务器,一台运行在2000 server上的sqls...
  • vipxiaotian
  • vipxiaotian
  • 2007年08月24日 15:26
  • 667

SQL Server的分布式XA事务

XA–eXtended Architecture 在事务中意为分布式事务 XA由协调者(coordinator,一般为transaction manager)和参与者(participants,一...
  • OnlyQi
  • OnlyQi
  • 2016年01月24日 17:00
  • 1396
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL Server之分布式事务
举报原因:
原因补充:

(最多只允许输入30个字)