加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.0577zz.cn/)- 应用程序、AI行业应用、CDN、低代码、区块链!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

站长学院:SQL Server存储过程与触发器高可用实战

发布时间:2026-09-28 08:11:24 所属栏目:MsSql教程 来源:DaWei
导读:  站长学院:SQL Server存储过程与触发器高可用实战——这标题我2025年12月在华东某省级政务云迁移项目里反复翻了十七遍,光是第4.2节“跨AG组触发器事务回滚边界”就标红批注了九处。当时客户那套用sp_send_dbmail发

  站长学院:SQL Server存储过程与触发器高可用实战——这标题我2025年12月在华东某省级政务云迁移项目里反复翻了十七遍,光是第4.2节“跨AG组触发器事务回滚边界”就标红批注了九处。当时客户那套用sp_send_dbmail发短信告警的存储过程,在Always On切换后连续三天凌晨3:17失联,日志里只留一句“Error 3903: The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION”,连SET XACT_ABORT ON都救不回来。


  我调出SQL Server 2022 CU12的traceflag 1802日志才发现,触发器内嵌的Linked Server查询在secondary副本执行时,会偷偷把XACT_ABORT状态重置为OFF——这事连微软KB5032267补丁都没提,直到2025年12月17日他们才在SQL Server内部Wiki里悄悄补了一句“trigger context may override session-level transaction settings”。我把这个发现塞进站长学院课程第6章的课后彩蛋里,附带三个绕过方案:一个是用sys.dm_hadr_database_replica_states硬查角色再动态拼接EXEC AT;第二个是改用Service Broker解耦;第三个最土——在触发器开头强行SET XACT_ABORT ON WITH ROLLBACK IMMEDIATE,虽然会导致某些嵌套事务意外中止,但至少比静默失败强。


  失败案例?上海某电商平台2025年11月大促前上线的新库存扣减存储过程,用了WITH (UPDLOCK, HOLDLOCK)加表级提示,结果在AG自动故障转移后,secondary副本残留的未提交锁持续23分钟——因为它的分布式事务协调器DTC居然被误配成“允许网络访问”而非“仅本机”。客户运维跑来问我“为什么监控看到sp_who2显示blocked_session_id=0却还卡着”,我当场抓包看到TCP端口135上飘着DTC的RPC呼叫,回放Wireshark才知道它正试图连向已下线的旧主库IP。站长学院里没写这个坑,但我补进了课件的“高可用盲区”附录页(PPT第89页右下角小字)。


  新技术。


  站长学院:SQL Server存储过程与触发器高可用实战,它让我想起2003年第一次手写xp_cmdshell调脚本的战战兢兢。现在用它做同城双活,一个存储过程能跨3个AG组+2个读写分离集群+1个Azure SQL托管实例——但必须关掉Query Store的自动清理策略,否则在2025年12月11日那个内存泄漏补丁(KB5038921)影响下,系统SPID 54会吃光tempdb的日志空间,而这个现象在站长学院视频第37分22秒演示时压根没复现出来。我实测数据里跑了23轮故障注入,其中第17轮发现:当触发器内含OPENJSON且JSON字符串超4096字符时,secondary副本的编译缓存会漏掉plan_handle更新,导致查询走错索引——这个细节我问过三位MVP,没人见过类似报告。我猜是优化器对JSON_VALUE的统计信息推断机制在只读副本上有缺陷,但不敢下定论,毕竟没拿到微软PG的源码。


文章配图,仅供参考

  得去翻2025年12月刚发布的SQL Server 2022 CU13安装日志了。

(编辑:站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!