如何为AWS RDS链接服务器启用分布式事务(SQL Server场景)
启用AWS RDS SQL Server链接服务器的分布式事务
我来帮你一步步搞定这个分布式事务的配置,毕竟跨本地SQL Server和RDS的触发器要用到分布式事务,得把几个关键环节都配置到位:
1. 确认AWS RDS实例的分布式事务支持
首先,AWS RDS SQL Server 2008是支持分布式事务的,但得先检查实例的参数组配置:
- 登录AWS控制台,找到你的RDS SQL Server 2008实例,查看它关联的参数组
- 确认
remote access参数设置为1(默认通常是开启的,但最好核实下) - 另外,RDS的DTC(分布式事务协调器)默认已经配置好了,但要确保本地SQL Server所在的网络能访问RDS实例的DTC端口——你可以在RDS实例的详情页面找到DTC的具体端口,同时要在VPC安全组里开放这个端口的入站规则,允许本地服务器的IP访问。
2. 配置本地SQL Server 2014的DTC
本地服务器必须启用DTC并允许远程事务交互:
- 按下Win+R输入
dcomcnfg打开组件服务 - 依次展开:组件服务 > 计算机 > 我的电脑 > 分布式事务协调器 > 本地DTC
- 右键点击「本地DTC」选择「属性」,切换到安全标签页:
- 勾选「允许远程客户端」「允许远程管理」「允许入站」「允许出站」
- 验证方式可以选「不需要验证」(如果是VPC内网连接,这样更方便;如果是公网连接,建议选合适的验证方式)
- 务必勾选「启用网络DTC访问」
- 点击确定后,重启「Distributed Transaction Coordinator」服务(可以在Windows服务列表里找到它)
3. 修改链接服务器的配置
在本地SQL Server 2014的SSMS里,调整AWSMSSQL链接服务器的属性:
- 展开「服务器对象 > 链接服务器」,找到AWSMSSQL
- 右键选择「属性」,切换到服务器选项标签页:
- 将「启用分布式事务」设置为
True - 同时确保「RPC」和「RPC Out」也设置为
True——触发器里要调用远程服务器的操作,这两项必须开启
- 将「启用分布式事务」设置为
- 点击确定保存配置
4. 调整触发器代码适配分布式事务
你的触发器需要明确纳入分布式事务的管理,避免数据不一致。这里给你调整后的代码示例,还加了错误处理逻辑:
USE [test] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TRIGGER [dbo].[ms_test] ON [dbo].[localservertable] FOR INSERT, UPDATE, DELETE AS BEGIN SET NOCOUNT ON; -- 避免返回多余行数影响触发器执行 DECLARE @iddata int; DECLARE @option int; -- 注意:UPDATE操作会同时有inserted和deleted表数据,DELETE只有deleted,INSERT只有inserted -- 这里先处理INSERT/UPDATE的情况,DELETE可以单独判断 SELECT @iddata = i.[id], @option = i.[option] FROM inserted i; BEGIN DISTRIBUTED TRANSACTION; -- 开启分布式事务 BEGIN TRY -- 这里替换成你要对RDS链接服务器执行的具体操作 -- 比如INSERT/UPDATE/DELETE对应的远程表操作: -- INSERT INTO [AWSMSSQL].[远程数据库名].[dbo].[远程表名] (id, option) VALUES (@iddata, @option); COMMIT TRANSACTION; END TRY BEGIN CATCH ROLLBACK TRANSACTION; -- 出错时回滚两边的操作 THROW; -- 抛出错误,方便排查问题 END CATCH END GO
5. 测试分布式事务是否生效
你可以执行一个测试操作,验证事务的一致性:
比如执行插入后故意触发错误,看两边的数据是否都回滚:
BEGIN TRANSACTION; INSERT INTO [test].[dbo].[localservertable] (id, option) VALUES (100, 2); -- 故意插入违反远程表约束的数据,触发错误 INSERT INTO [AWSMSSQL].[远程数据库名].[dbo].[远程表名] (id, option) VALUES (100, 999); ROLLBACK TRANSACTION;
如果本地表和RDS远程表都没有新增这条数据,说明分布式事务已经正常工作了。
内容的提问来源于stack exchange,提问作者Suraj
相关产品推荐
相关产品推荐

