SQL Server 中的 Microsoft 分布式事务处理协调器支持 - Amazon Relational Database Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

SQL Server 中的 Microsoft 分布式事务处理协调器支持

分布式事务 是涉及两个或更多网络主机的数据库事务。Amazon RDS for SQL Server 支持主机之间的分布式事务,其中一个主机可以是以下对象之一:

  • RDS for SQL Server DB 实例

  • 本地 SQL Server 主机

  • 安装了 SQL Server 的 Amazon EC2 主机

  • 具有支持分布式事务的数据库引擎的任何其他 EC2 主机或 RDS 数据库实例

在 RDS 中,从 SQL Server 2012(版本 11.00.5058.0.v1 及更高版本)开始,SQL Server 的所有版本都支持分布式事务。该支持使用 Microsoft 分布式事务处理协调器 (MSDTC) 提供。有关 MSDTC 的详细信息,请参阅 Microsoft 文档中的分布式事务处理协调器

限制

以下限制适用于在 RDS for SQL Server 上使用 MSDTC:

  • 使用 SQL Server 数据库镜像的实例上不支持 MSDTC。有关详细信息,请参阅事务 – 可用性组和数据库镜像

  • in-doubt xact resolution 参数必须设置为 1 或 2。有关更多信息,请参阅修改 MSDTC 的参数

  • MSDTC 要求参与分布式事务的所有主机名都可以使用其计算机名进行解析。RDS 会自动为加入域的实例维护此功能。但是,对于独立实例,请确保手动配置 DNS 服务器。

  • 依赖于 RDS 实例上的客户端动态链接库 (DLL) 的分布式事务不受支持。

启用 MSDTC

使用以下过程为数据库实例启用 MSDTC:

  1. 创建新的选项组或选择现有的选项组。

  2. MSDTC 选项添加到该选项组。

  3. 创建新的参数组,或选择现有参数组。

  4. 修改参数组以将 in-doubt xact resolution 参数设置为 1 或 2。

  5. 将选项组和参数组与数据库实例关联。

为 MSDTC 创建选项组

使用 AWS 管理控制台 或 AWS CLI 创建对应于 SQL Server 引擎和数据库实例版本的选项组。

注意

如果现有选项组针对的是正确的 SQL Server 引擎和版本,也可以使用现有选项组。

以下控制台过程创建适用于 SQL Server 标准版 2016 的选项组。

创建选项组

  1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在导航窗格中,选择选项组

  3. 选择创建组

  4. 创建选项组窗格中,执行以下操作:

    1. 对于名称,输入选项组的名称,该名称在 AWS 账户内具有唯一性,例如 msdtc-se-2016。此名称只能包含字母、数字和连字符。

    2. 对于描述,输入选项组的简要描述,例如 MSDTC option group for SQL Server SE 2016。此说明用于显示说明。

    3. 对于引擎,选择 sqlserver-se

    4. 对于主要引擎版本,选择 13.00

  5. 选择 Create

以下示例为 SQL Server 标准版 2016 创建一个选项组。

创建选项组

  • 使用以下命令之一。

    对于 Linux、macOS 或 Unix:

    aws rds create-option-group \ --option-group-name msdtc-se-2016 \ --engine-name sqlserver-se \ --major-engine-version 13.00 \ --option-group-description "MSDTC option group for SQL Server SE 2016"

    对于 Windows:

    aws rds create-option-group ^ --option-group-name msdtc-se-2016 ^ --engine-name sqlserver-se ^ --major-engine-version 13.00 ^ --option-group-description "MSDTC option group for SQL Server SE 2016"

将 MSDTC 选项添加到选项组

接下来,使用 AWS 管理控制台或 AWS CLI 将 MSDTC 选项添加到选项组。

以下选项设置为必需:

  • 端口 – 用于访问 MSDTC 的端口。允许的值为 1150–49151,但不包括 1234、1434、3260、3343、3389 和 47001。默认值是 5000。

    确保在防火墙规则中启用了要使用的端口。此外,请确保根据需要,在与数据库实例关联的安全组的入站和出站规则中启用了此端口。有关更多信息,请参阅 无法连接到 Amazon RDS 数据库实例

  • 安全组 – RDS 数据库实例的 VPC 或数据库安全组成员。

  • 身份验证类型 – 主机之间的身份验证模式。支持以下身份验证类型:

    • 双向 – RDS 实例使用集成身份验证双向进行身份验证。如果选择此选项,则与此选项组关联的所有实例都必须加入域。

    • 无 – 主机之间不进行身份验证。我们建议不要在生产环境中使用此模式。

  • 事务日志大小 – MSDTC 事务日志的大小。允许的值为 4–1024 MB。默认大小为 4 MB。

以下选项设置可选:

  • 启用入站连接 – 是否允许指向与此选项组关联的实例的入站 MSDTC 连接。

  • 启用出站连接 – 是否允许来自与此选项组关联的实例的出站 MSDTC 连接。

  • 启用 XA – 是否允许 XA 事务。有关 XA 协议的更多信息,请参阅 XA 规范

    注意

    不支持使用自定义 XA 动态链接库。

  • 启用 SNA LU – 是否允许将 SNA LU 协议用于分布式事务。有关 SNA LU 协议支持的更多信息,请参阅 Microsoft 文档中的管理 IBM CICS LU 6.2 事务

添加 MSDTC 选项

  1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在导航窗格中,选择选项组

  3. 选择刚刚创建的选项组。

  4. 选择添加选项

  5. 选项详细信息下,为选项名称 选择 MSDTC

  6. 选项设置下:

    1. 对于端口,输入访问 MSDTC 的端口号。默认值为 5000

    2. 对于安全组,请选择要与选项关联的 VPC 或数据库安全组。

    3. 对于身份验证类型,请选择双向

    4. 对于事务日志大小,请输入 4–1024 之间的值。默认值为 4

  7. 其他配置下,执行以下操作:

    1. 对于连接,根据需要选择启用入站连接启用出站连接

    2. 对于允许的协议,根据需要选择启用 XA启用 SNA LU

  8. 计划 (Scheduling) 下,选择是立即添加选项还是在下一个维护时段添加选项。

  9. 选择添加选项

    添加此选项不需要重新启动。

添加 MSDTC 选项

  1. 使用以下必需参数创建 JSON 文件,例如 msdtc-option.json

    { "OptionGroupName":"msdtc-se-2016", "OptionsToInclude": [ { "OptionName":"MSDTC", "Port":5000, "VpcSecurityGroupMemberships":["sg-0abcdef123"], "OptionSettings":[{"Name":"AUTHENTICATION","Value":"MUTUAL"},{"Name":"TRANSACTION_LOG_SIZE","Value":4}] }], "ApplyImmediately": true }
  2. MSDTC 选项添加到该选项组。

    对于 Linux、macOS 或 Unix:

    aws rds add-option-to-option-group \ --cli-input-json file://msdtc-option.json \ --apply-immediately

    对于 Windows:

    aws rds add-option-to-option-group ^ --cli-input-json file://msdtc-option.json ^ --apply-immediately

    无需重新启动。

为 MSDTC 创建参数组

为与 SQL Server 版本和数据库实例版本对应的 in-doubt xact resolution 参数创建或修改参数组。

以下示例为 SQL Server 标准版 2016 创建一个参数组。

创建参数组

  1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在导航窗格中,选择参数组

  3. 选择创建参数组

  4. 创建参数组窗格中,执行以下操作:

    1. 对于参数组系列,选择 sqlserver-se-13.0

    2. 对于组名称,输入参数组的标识符,如 msdtc-sqlserver-se-13

    3. 对于描述,输入 in-doubt xact resolution

  5. 选择 Create

以下示例为 SQL Server 标准版 2016 创建一个参数组。

创建参数组

  • 使用以下命令之一。

    对于 Linux、macOS 或 Unix:

    aws rds create-db-parameter-group \ --db-parameter-group-name msdtc-sqlserver-se-13 \ --db-parameter-group-family "sqlserver-se-13.0" \ --description "in-doubt xact resolution"

    对于 Windows:

    aws rds create-db-parameter-group ^ --db-parameter-group-name msdtc-sqlserver-se-13 ^ --db-parameter-group-family "sqlserver-se-13.0" ^ --description "in-doubt xact resolution"

修改 MSDTC 的参数

修改与 SQL Server 版本和数据库实例版本对应的参数组中的 in-doubt xact resolution 参数。

对于 MSDTC,将 in-doubt xact resolution 参数设置为以下选项之一:

  • 1 – 假定提交。任何 MSDTC 有疑问的事务都假定为已经提交。

  • 2 – 假定中止。任何 MSDTC 有疑问的事务都假定为已经中止。

有关更多信息,请参阅 Microsoft 文档中的有疑问的 Xact 解析服务器配置选项

以下示例修改您为 SQL Server 标准版 2016 创建的参数组。

修改参数组

  1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在导航窗格中,选择参数组

  3. 选择参数组,例如 msdtc-sqlserver-se-13

  4. 参数下,从参数列表中筛选 xact

  5. 选择 in-doubt xact resolution (有疑问的 Xact 解析)

  6. 选择编辑参数

  7. 输入 12

  8. 选择 Save changes

以下示例修改您为 SQL Server 标准版 2016 创建的参数组。

修改参数组

  • 使用以下命令之一。

    对于 Linux、macOS 或 Unix:

    aws rds modify-db-parameter-group \ --db-parameter-group-name msdtc-sqlserver-se-13 \ --parameters "ParameterName='in-doubt xact resolution',ParameterValue=1,ApplyMethod=immediate"

    对于 Windows:

    aws rds modify-db-parameter-group ^ --db-parameter-group-name msdtc-sqlserver-se-13 ^ --parameters "ParameterName='in-doubt xact resolution',ParameterValue=1,ApplyMethod=immediate"

将选项组和参数组与数据库实例关联

您可以使用 AWS 管理控制台 或 AWS CLI 将 MSDTC 选项组和参数组与数据库实例相关联。

您可以将 MSDTC 选项组和参数组与新的或现有的数据库实例相关联。

您可以将 MSDTC 选项组和参数组与新的或现有的数据库实例相关联。

注意

如果您使用现有的加入域数据库实例,则该实例必须已经关联了 Active Directory 域和 IAM 角色。如果您创建新的加入域实例,请指定现有的 Active Directory 域和 IAM 角色。有关更多信息,请参阅 将 Windows 身份验证与适用于数据库实例的 Amazon RDS 结合使用

使用 MSDTC 选项组和参数组创建数据库实例

  • 指定创建选项组时使用的相同数据库引擎类型和主要版本。

    对于 Linux、macOS 或 Unix:

    aws rds create-db-instance \ --db-instance-identifier mydbinstance \ --db-instance-class db.m5.2xlarge \ --engine sqlserver-se \ --engine-version 13.00.5426.0.v1 \ --allocated-storage 100 \ --master-user-password secret123 \ --master-username master \ --storage-type gp2 \ --license-model li \ --domain-iam-role-name my-directory-iam-role \ --domain my-domain-id \ --option-group-name msdtc-se-2016 \ --db-parameter-group-name msdtc-sqlserver-se-13

    对于 Windows:

    aws rds create-db-instance ^ --db-instance-identifier mydbinstance ^ --db-instance-class db.m5.2xlarge ^ --engine sqlserver-se ^ --engine-version 13.00.5426.0.v1 ^ --allocated-storage 100 ^ --master-user-password secret123 ^ --master-username master ^ --storage-type gp2 ^ --license-model li ^ --domain-iam-role-name my-directory-iam-role ^ --domain my-domain-id ^ --option-group-name msdtc-se-2016 ^ --db-parameter-group-name msdtc-sqlserver-se-13

修改数据库实例并关联 MSDTC 选项组和参数组

  • 使用以下命令之一。

    对于 Linux、macOS 或 Unix:

    aws rds modify-db-instance \ --db-instance-identifier mydbinstance \ --option-group-name msdtc-se-2016 \ --db-parameter-group-name msdtc-sqlserver-se-13 \ --apply-immediately

    对于 Windows:

    aws rds modify-db-instance ^ --db-instance-identifier mydbinstance ^ --option-group-name msdtc-se-2016 ^ --db-parameter-group-name msdtc-sqlserver-se-13 ^ --apply-immediately

使用分布式事务

在 Amazon RDS for SQL Server 中,您可以按照与本地运行分布式事务相同的方式运行分布式事务:

  • 使用 .NET 框架 System.Transactions 可提升事务,它通过将分布式事务的创建推迟到在需要时进行,以此优化分布式事务。

    在这种情况下,提升是自动的,不需要您进行任何干预。如果事务中只有一个资源管理器,则不执行任何提升。有关隐式事务范围的更多信息,请参阅 Microsoft 文档中的使用事务范围实施隐式事务

    以下 .NET 实施支持可提升事务:

    • 从 ADO.NET 2.0 开始,System.Data.SqlClient 支持 SQL Server 的可提升事务。有关更多信息,请参阅 Microsoft 文档中的 System.Transactions 集成与 SQL Server

    • ODP.NET 支持 System.Transactions。将为在 TransactionsScope 范围内与 Oracle Database 11g 发行版 1(版本 11.1)及更高版本建立的第一个连接创建一个本地事务。建立第二个连接时,此事务将自动提升为分布式事务。有关 ODP.NET 中的分布式事务支持的更多信息,请参阅 Microsoft 文档中的 Microsoft 分布式事务处理协调器集成

  • 使用 BEGIN DISTRIBUTED TRANSACTION 语句。有关更多信息,请参阅 Microsoft 文档中的 BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)

使用事务跟踪

RDS 支持控制 MSDTC 事务跟踪并从 RDS 数据库实例下载它们以进行故障排除。您可以通过运行以下 RDS 存储过程来控制事务跟踪会话。

exec msdb.dbo.rds_msdtc_transaction_tracing 'trace_action' [@traceall='0|1'], [@traceaborted='0|1'], [@tracelong='0|1'];

以下参数是必需参数:

  • trace_action – 跟踪操作。它可以是 STARTSTOPSTATUS

以下参数为可选参数:

  • @traceall – 设置为 1 可跟踪所有分布式事务。默认值为 0。

  • @traceaborted – 设置为 1 可跟踪已取消的分布式事务。默认值为 0。

  • @tracelong – 设置为 1 可跟踪长时间运行的分布式事务。默认值为 0。

例 启动跟踪操作示例

要启动新的事务跟踪会话,请运行以下示例语句。

exec msdb.dbo.rds_msdtc_transaction_tracing 'START' @traceall='0', @traceaborted='1', @tracelong='1';
注意

一次只能有一个活动的事务跟踪会话。如果在有跟踪会话处于活动状态时发出了新的跟踪会话 START 命令,则返回错误,并且活动的跟踪会话保持不变。

例 停止跟踪操作示例

要停止事务跟踪会话,请运行以下语句。

exec msdb.dbo.rds_msdtc_transaction_tracing 'STOP'

此语句停止活动的事务跟踪会话,并将事务跟踪数据保存到 RDS 数据库实例上的日志目录中。输出的第一行包含整体执行结果,后面的行表示操作的详细信息。

以下是成功跟踪会话停止的示例。

OK: Trace session has been successfully stopped. Setting log file to: D:\rdsdbdata\MSDTC\Trace\dtctrace.log Examining D:\rdsdbdata\MSDTC\Trace\msdtctr.mof for message formats, 8 found. Searching for TMF files on path: (null) Logfile D:\rdsdbdata\MSDTC\Trace\dtctrace.log: OS version 10.0.14393 (Currently running on 6.2.9200) Start Time <timestamp> End Time <timestamp> Timezone is @tzres.dll,-932 (Bias is 0mins) BufferSize 16384 B Maximum File Size 10 MB Buffers Written Not set (Logger may not have been stopped). Logger Mode Settings (11000002) ( circular paged ProcessorCount 1 Processing completed Buffers: 1, Events: 3, EventsLost: 0 :: Format Errors: 0, Unknowns: 3 Event traces dumped to d:\rdsdbdata\Log\msdtc_<timestamp>.log

您可以使用详细信息查询生成的日志文件的名称。有关从 RDS 数据库实例下载日志文件的更多信息,请参阅 Amazon RDS 数据库日志文件

跟踪会话日志在实例上保留 35 天。任何较旧的跟踪会话日志都会自动删除。

例 状态跟踪操作示例

要跟踪事务跟踪会话的状态,请运行以下语句。

exec msdb.dbo.rds_msdtc_transaction_tracing 'STATUS'

此语句在规则集中将以下内容作为单独的行输出。

OK SessionStatus: <Started|Stopped> TraceAll: <True|False> TraceAborted: <True|False> TraceLongLived: <True|False>

第一行表示操作的整体结果:OKERROR,并带有详细信息(如果适用)。后面的行指示有关跟踪会话状态的详细信息:

  • SessionStatus 的值可以是以下值之一:

    • Started,有跟踪会话正在运行时。

    • Stopped,没有跟踪会话正在运行时。

  • 跟踪会话标志可以是 TrueFalse,具体取决于它们在 START 命令中的设置方式。

修改 MSDTC 选项

启用 MSDTC 选项后,您可以修改其设置。有关如何修改选项设置的信息,请参阅修改选项设置

注意

对 MSDTC 选项设置的一些更改需要重新启动 MSDTC 服务。此要求可能会影响正在运行的分布式事务。

禁用 MSDTC

要禁用 MSDTC,请从其选项组中删除 MSDTC 选项。

从其选项组中删除 MSDTC 选项

  1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在导航窗格中,选择选项组

  3. 选择具有 MSDTC 选项的选项组(在前面的示例中为 msdtc-se-2016)。

  4. 选择 Delete option (删除选项)

  5. 删除选项下,为待删除的选项选择 MSDTC

  6. Apply immediately (立即应用) 下,选择 Yes (是) 可立即删除选项,选择 No (否) 可在下次维护时段时删除。

  7. 选择 Delete

从其选项组中删除 MSDTC 选项

  • 使用以下命令之一。

    对于 Linux、macOS 或 Unix:

    aws rds remove-option-from-option-group \ --option-group-name msdtc-se-2016 \ --options MSDTC \ --apply-immediately

    对于 Windows:

    aws rds remove-option-from-option-group ^ --option-group-name msdtc-se-2016 ^ --options MSDTC ^ --apply-immediately

RDS SQL Server 的 MSDTC 故障排除

在某些情况下,您可能无法在客户端计算机上运行的 MSDTC,与在 RDS SQL Server 数据库实例上运行的 MSDTC 服务之间建立连接。如果是这样,请确保满足以下条件:

  • 与数据库实例关联的安全组的入站规则配置正确。有关更多信息,请参阅 无法连接到 Amazon RDS 数据库实例

  • 您的客户端计算机配置正确。

  • 客户端计算机上的 MSDTC 防火墙规则已启用。

配置客户端计算机

  1. 打开组件服务

    或者,在服务器管理器中,选择工具,然后选择组件服务

  2. 展开组件服务,展开计算机,展开 我的电脑,然后展开分布式事务处理协调器

  3. 打开 Local DTC (本地 DTC) 的上下文(右键单击)菜单,然后选择 Properties (属性)

  4. 选择安全性选项卡。

  5. 选择以下所有选项:

    • 网络 DTC 访问

    • 允许入站

    • 允许出站

  6. 确保选择了正确的身份验证模式:

    • 需要双向身份验证 – 客户端计算机与参与分布式事务的其他节点加入到同一个域中,或者在域之间配置了信任关系。

    • 无需身份验证 – 所有其他情况。

  7. 选择确定以保存您的更改。

  8. 如果系统提示您重新启动服务,请选择

启用 MSDTC 防火墙规则

  1. 打开 Windows 防火墙,然后选择高级设置

    打开服务器管理器,选择工具,然后选择高级安全 Windows 防火墙

    注意

    根据您的操作系统,Windows 防火墙可能称为 Windows Defender 防火墙。

  2. 在左侧窗格中选择入站规则

  3. 如果尚未启用以下防火墙规则,请启用:

    • 分布式事务处理协调器 (RPC)

    • 分布式事务处理协调器 (RPC) - EPMAP

    • 分布式事务处理协调器 (TCP-In)

  4. 关闭 Windows 防火墙。