当前位置: 首页 > news >正文

SQL SERVER 分布式事务(DTC)

BEGIN DISTRIBUTED TRANSACTION
指定一个由 Microsoft 分布式事务处理协调器 (MS DTC) 管理的 Transact-SQL 分布式事务的起始。

语法
BEGIN DISTRIBUTED TRAN [ SACTION ]
[ transaction_name | @tran_name_variable ]

参数
transaction_name

是用户定义的事务名,用于跟踪 MS DTC 实用工具中的分布式事务。transaction_name 必须符合标识符规则,但是仅使用头 32 个字符。

@tran_name_variable

是用户定义的一个变量名,它含有一个事务名,该事务名用于跟踪 MS DTC 实用工具中的分布式事务。必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。

注释
执行 BEGIN DISTRIBUTED TRANSACTION 语句的服务器是事务创建人,并且控制事务的完成。当连接发出后续 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 语句时,主控服务器请求 MS DTC 在所涉及的服务器间管理分布式事务的完成。

有两个方法可将远程 SQL 服务器登记在一个分布式事务中:

分布式事务中已登记的连接执行一个远程存储过程调用,该调用引用一个远程服务器。

分布式事务中已登记的连接执行一个分布式查询,该查询引用一个远程服务器。
例如,如果在 ServerA 上发出 BEGIN DISTRIBUTED TRANSACTION,该连接调用 ServerB 上的存储过程和 ServerC 上的另一个存储过程,并且 ServerC 上的存储过程对 ServerD 执行一个分布式查询,那么四个 SQL 服务器都进入分布式事务中了。ServerA 是该事务的创建者和控制服务器。

分布式事务 Transact-SQL 涉及的连接并不获取可以传给另一个连接的事务对象,从而也不能用该方法显式登记在分布式事务中。远程服务器登记到事务中的唯一方法是成为远程存储过程调用或分布式查询的目标。

sp_configure remote proc trans 选项控制对本地事务中的远程存储过程调用是否自动使本地事务被提升为由 MS DTC 管理的分布式事务。连接层 SET 选项 REMOTE_PROC_TRANSACTIONS 可用于替代由 sp_configure remote proc trans 建立的服务器默认值。启用本选项后,远程存储过程调用会使一个本地事务提升为分布式事务。创建 MS DTC 事务的连接成为该事务的创建人。COMMIT TRANSACTION 初始化一个 MS DTC 协调的提交。如果启用了 sp_configure remote proc trans 选项,本地事务中的远程存储过程调用将被自动保护,成为分布式事务的一部分,而不需要重写应用程序以便专门使用 BEGIN DISTRIBUTED TRANSACTION 以替代 BEGIN TRANSACTION。

在本地事务中执行一个分布式查询时,如果目标 OLE DB 数据源支持 ItransactionLocal,则该事务被自动提升为分布式事务。如果目标 OLE DB 数据源不支持 ItransactionLocal,则在分布式查询中只允许只读操作。

关于分布式事务环境和处理的更多信息,请参见 Microsoft 分布式事务处理协调器文档。

权限
默认情况下,任何有效用户都拥有 BEGIN DISTRIBUTED TRANSACTION 权限。

示例
本例在本地和远程数据库上更新作者的姓。本地和远程数据库将同时提交或同时回滚本事务。

说明 除非正在运行 Microsoft® SQL Server™ 的计算机上当前装有 MS DTC,否则本例会产生错误信息。关于安装 MS DTC 的更多信息,请参见 Microsoft 分布式事务处理协调器文档。


USE pubs
GO
BEGIN DISTRIBUTED TRANSACTION
UPDATE authors
SET au_lname = 'McDonald' WHERE au_id = '409-56-7008'
EXECUTE 
link_Server_T.pubs.dbo.changeauth_lname '409-56-7008','McDonald'
COMMIT TRAN
GO

Note1:
如果需要连接远程DB,如果是linkServer 方式连接的话,一定要修该linkServer RPC 选项置为True

Note2 
在由 BEGIN DISTRIBUTED TRANSACTION 显式启动或从本地事务升级而来的分布式事务中,不支持 SAVE TRANSACTION

分布式事务的配置

1. 双方启动MSDTC服务

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

2. 打开双方135端口

MSDTC服务依赖于RPC(Remote Procedure Call (RPC))服务,RPC使用135端口,保证RPC服务启动,如果服务器有防火墙,保证135端口不被防火墙挡住。

使用“telnet IP 135 ”命令测试对方端口是否对外开放。也可用端口扫描软件(比如Advanced Port Scanner)扫描端口以判断端口是否开放。

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

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

4. 在事务开始前加入set xact_abort ON语句

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

5. MSDTC设置

打开“管理工具――组件服务”,以此打开“组件服务――计算机”,在“我的电脑”上点击右键。在MSDTC选项卡中,点击“安全配置”按钮。

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

l 选中“网络DTC访问”

l 在客户端管理中选中“允许远程客户端”“允许远程管理”

l 在事务管理通讯中选“允许入站”“允许出站”“不要求进行验证”

l 保证DTC登陆账户为:NT Authority\NetworkService

6. 链接服务器和名称解析问题

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

l 第一种情况,产品选”SQL Server”

EXEC sp_addlinkedserver @server='linkServerName', @srvproduct = N'SQL Server' 
这种情况,@server (linkServerName)就是要链接的sqlserver服务器名或者ip地址。

l 第二种情况,访问接口选“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服务也是通过服务器名或者ip地址访问链接服务器,所以要保证数据库引擎和DTC都能通过服务器名或者ip地址访问到链接服务器。

本文转自 梦在旅途 博客园博客,原文链接:http://www.cnblogs.com/zuowj/p/3512173.html  ,如需转载请自行联系原作者

相关文章:

  • (转)http协议
  • 如何安全设定和检测你的密码安全性?
  • FreeRADIUS 负载均衡和高可用
  • .net 4.0发布后不能正常显示图片问题
  • Liferay 模板文件的解析
  • 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
  • NeHe OpenGL第三十四课:地形
  • ansible-playbook批量部署zabbix
  • 艾伟_转载:C#来创建和读取XML文档
  • 一例HP ADG数据恢复成功(8×73GB SCSI)
  • 艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
  • php经典面试题
  • JavaScript控制图片横向滚动代码
  • 关于服务器缓存的思考
  • 伸向开源世界的“橄榄枝”
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • canvas 高仿 Apple Watch 表盘
  • Codepen 每日精选(2018-3-25)
  • Create React App 使用
  • Lsb图片隐写
  • Otto开发初探——微服务依赖管理新利器
  • python docx文档转html页面
  • TypeScript迭代器
  • Vue UI框架库开发介绍
  • vue:响应原理
  • 包装类对象
  • 从伪并行的 Python 多线程说起
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 如何优雅地使用 Sublime Text
  • 思否第一天
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 线上 python http server profile 实践
  • 一天一个设计模式之JS实现——适配器模式
  • C# - 为值类型重定义相等性
  • Java性能优化之JVM GC(垃圾回收机制)
  • python最赚钱的4个方向,你最心动的是哪个?
  • 带你开发类似Pokemon Go的AR游戏
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • $L^p$ 调和函数恒为零
  • (23)Linux的软硬连接
  • (C语言)二分查找 超详细
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (顺序)容器的好伴侣 --- 容器适配器
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)nsfocus-绿盟科技笔试题目
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net framework4与其client profile版本的区别
  • .Net IOC框架入门之一 Unity