怎样编写SQL存储过程实现跨服务器的分布式事务处理

浅涛姑娘_8966

浅涛姑娘_8966

2026-10-13

289人浏览

原创

必须先用sp_addlinkedserver配置链接服务器并启用rpc和登录映射,再用begin distributed transaction显式启动分布式事务,且msdtc需正确配置;否则跨实例操作将因msg 7314/7391/3915等错误失败。

怎样编写sql存储过程实现跨服务器的分布式事务处理

SQL Server 中用 sp_addlinkedserver 配置跨服务器连接是前提

没有可用的链接服务器,UPDATE 或 INSERT 跨实例语句会直接报错 Msg 7314, Level 16, State 1(对象不存在于远程服务器)。必须先在发起事务的服务器上执行 sp_addlinkedserver,指定目标服务器名、提供程序(如 SQLNCLI)和数据源(IP+端口或实例名)。注意:如果目标 SQL Server 启用了命名实例,@datasrc 必须包含实例名(例如 '192.168.1.100\PROD'),否则连接失败。

常见疏漏点:

  • sp_addlinkedserver 默认不启用 RPC(远程过程调用),需额外执行 sp_serveroption @server='xxx', @optname='rpc out', @optvalue='true'
  • 登录映射要用 sp_addlinkedsrvlogin 显式绑定本地账号与远程账号,不能依赖 NULL 映射——后者在 Windows 身份验证跨域时大概率失败
  • 链接服务器名不能含点号(如 srv.prod),否则在四部分命名中被解析为数据库名,导致语法错误

用 BEGIN DISTRIBUTED TRANSACTION 启动真正的分布式事务

普通 BEGIN TRAN 只作用于本地,跨服务器操作会自动升级为分布式事务,但显式使用 BEGIN DISTRIBUTED TRANSACTION 更可靠——它强制 MSDTC(Microsoft Distributed Transaction Coordinator)介入,避免因语句顺序或锁等待触发隐式升级失败。

关键约束:

  • 该语句必须在链接服务器已配置且可连通后执行;否则报错 Msg 7391, Level 16, State 2(无法执行分布式事务)
  • 不能在已有本地事务内嵌套调用;否则触发 Msg 3915, Level 16, State 1(无法将本地事务升级为分布式事务)
  • 所有跨服务器操作(包括 SELECT 用于判断逻辑分支)都必须在同一个 BEGIN DISTRIBUTED TRANSACTION 块内完成,否则后续语句脱离事务上下文

示例片段:

Jounce.ai
Jounce.ai

Jounce.ai是一款面向小企业主和营销人员的 AI 品牌文案与视觉创作工具。

下载
BEGIN DISTRIBUTED TRANSACTION
    UPDATE [LinkedSrv].[DB1].[dbo].[Orders] SET status = 'shipped' WHERE id = 1001;
    INSERT INTO [LocalDB].[dbo].[Log] (msg) VALUES ('remote update ok');
COMMIT TRAN;

MSDTC 配置错误是 80% 分布式事务失败的根源

即使 SQL 语句无误,Msg 7391 或超时中断几乎都指向 MSDTC。它不是 SQL Server 自带组件,而是 Windows 系统服务,需手动配置:

  • 两台服务器上的 Distributed Transaction Coordinator 服务必须处于 Running 状态,且启动类型设为 Automatic
  • 防火墙必须放行 TCP 135 端口(RPC endpoint mapper)及动态分配的 MSDTC 端口(建议在 DTC 属性 → 安全性配置中勾选「不支持网络 DTC 访问」以外的所有选项,并固定端口)
  • 若服务器在不同域或工作组,必须启用「允许远程客户端」、「允许远程管理」、「允许入站/出站」,并关闭「要求进行身份验证」——否则跨域通信被拒绝

验证是否生效:在发起端运行 dtcping TargetServerName(需提前安装 dtcping 工具),输出中出现 ping succeded 才算通路建立。

存储过程中调用 OPENQUERY 时事务行为容易误判

用 OPENQUERY 执行远程更新看似简洁,但它本质是“远程执行+结果集返回”,其内部事务由远程服务器独立管理。这意味着:OPENQUERY(...UPDATE...) 成功,不代表它已纳入当前分布式事务——除非整个 OPENQUERY 调用发生在 BEGIN DISTRIBUTED TRANSACTION 块内,且远程服务器也参与 MSDTC 协调。

更稳妥的做法是避免 OPENQUERY,改用四部分命名([srv].[db].[schema].[table]),因为 SQL Server 能明确识别该操作需分布式协调。若必须用 OPENQUERY,需确保:

  • 链接服务器选项 remote proc transaction promotion 设为 true(默认值,但有人为改成 false)
  • 远程服务器同样启用了 MSDTC 并正确配置,否则 OPENQUERY 内部事务会自动提交,破坏原子性
  • 不能在 OPENQUERY 中引用本地临时表(#tmp),会报 Msg 7357;应改用表变量或全局临时表

真正难调试的是事务隔离级别传播——本地设 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE,对远程操作无效,远程仍按自身默认级别执行。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

存储过程

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
服务器是什么
服务器是什么

服务器是一种计算机硬件设备或软件程序,它具有强大的计算和存储能力,用请求、存储数据和提供服务。它在互联网中着关重要的作用,为用户提供各种服务和资源。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.15

437

5

连接apple id服务器时出错
连接apple id服务器时出错

连接apple id服务器时出错的原因包括网络连接问题、服务器问题、Apple ID账户问题、设备问题、防火墙或安全软件问题、时间和日期设置问题、Apple服务器维护等。本专题为大家提供apple id相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.08

920

5

搭建互联网服务器
搭建互联网服务器

搭建互联网服务器需要:1、选择合适的硬件和操作系统,第一步是选择合适的硬件和操作系统;2、安装和配置操作系统,是搭建互联网服务器的关键步骤;3、安装和配置服务器软件,是搭建互联网服务器的下一步,常见的服务器软件包括Apache、Nginx、Tomcat等;4、配置防火墙和安全性,是搭建互联网服务器的重要步骤;5、域名解析和配置,是搭建互联网服务器的最后一步。

2023.09.19

2872

5

如何查看服务器状态
如何查看服务器状态

查看服务器状态的方法有使用命令行工具、图形界面工具、监控工具、日志文件和远程管理工具等。本专题为大家提供服务器状态相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

956

5

服务器域名转接慢怎么解决
服务器域名转接慢怎么解决

服务器域名转接慢的解决办法有DNS优化、服务器优化、CDN加速、前端优化和网络优化等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.17

849

5

服务器评测软件
服务器评测软件

服务器评测软件有PassMark Software、CPU-Z、GPU-Z、CrystalDiskMark、IOmeter、JMeter、LoadRunner、Apache Bench等等。详细介绍:1、PassMark Software是一款综合性的服务器性能测试软件,可以评估服务器在各种负载条件下的性能;2、CPU-Z是一款可以提供服务器CPU详细信息的软件等等。

2023.10.17

434

3

如何开启TFTP服务器
如何开启TFTP服务器

开启TFTP服务器的步骤包括选择TFTP服务器软件、下载和安装软件、配置TFTP服务器以及启动和测试服务器等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

2596

4

服务器负载不兼容怎么解决
服务器负载不兼容怎么解决

解决方法:1、增加服务器资源;2、负载均衡;3、优化应用程序;4、增加缓存机制;5、分布式架构;6、限流和熔断;7、自动化扩容。想知道更详细服务器负载不兼容的解决方法,可以访问本专题下面的文章。

2023.10.20

4832

4

宽带如何接入服务器
宽带如何接入服务器

宽带接入服务器的方法有ADSL宽带接入服务器、光纤接入服务器、无线接入服务器和以太网接入服务器等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.20

767

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
布尔教育燕十八mysql高级视频教程
布尔教育燕十八mysql高级视频教程

共24课时 | 8.6万人学习

魔乐科技oracle视频教程
魔乐科技oracle视频教程

共27课时 | 6.7万人学习

肖文吉Oracle视频教程
肖文吉Oracle视频教程

共33课时 | 9万人学习