RDS for SQL Server 中的 Microsoft 分布式事务处理协调器支持 - Amazon Relational Database Service

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

分布式事务是涉及两个或多个网络主机的数据库事务。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 及更高版本)开始,RDS for SQL Server 的所有版本都支持分布式事务。该支持使用 Microsoft 分布式事务处理协调器 (MSDTC) 提供。有关 MSDTC 的详细信息,请参阅 Microsoft 文档中的分布式事务处理协调器

限制

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

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

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

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

  • SQL Server 2017 版本 14.00.3223.3 及更高版本和 SQL Server 2019 支持 Java Database Connectivity (JDBC) XA 事务。

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

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

启用 MSDTC

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

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

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

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

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

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

为 MSDTC 创建选项组

使用 AWS Management Console 或 AWS CLI 创建对应于 SQL Server 引擎和数据库实例版本的选项组。

注意

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

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

创建选项组
  1. 登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/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. 选择创建

以下示例为 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 Management Console或 AWS CLI 将 MSDTC 选项添加到选项组。

以下选项设置为必需:

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

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

  • Security groups(安全组)– RDS 数据库实例的 VPC 安全组成员。

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

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

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

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

以下选项设置可选:

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

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

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

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

添加 MSDTC 选项
  1. 登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

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

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

  4. 选择添加选项

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

  6. 选项设置下:

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

    2. 对于 Security groups (安全组),请选择要与选项关联的 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 Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

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

  3. 选择创建参数组

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

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

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

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

  5. 选择创建

以下示例为 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 参数设置为以下选项之一:

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

  • 2Presume abort。任何 MSDTC 有疑问的事务都假定为已停止。

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

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

修改参数组
  1. 登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

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

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

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

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

  6. 选择编辑参数

  7. 输入 12

  8. 选择保存更改

以下示例修改您为 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 Management Console 或 AWS CLI 将 MSDTC 选项组和参数组与数据库实例相关联。

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

  • 对于新数据库实例,请在启动实例时将其关联。有关更多信息,请参阅“创建 Amazon RDS 数据库实例”。

  • 对于现有数据库实例,请通过修改实例将其关联。有关更多信息,请参阅“修改 Amazon RDS 数据库实例”。

    注意

    如果您使用加入域的现有数据库实例,则该实例必须已经关联了 Active Directory 域和 AWS Identity and Access Management (IAM) 角色。如果您创建新的加入域实例,请指定现有的 Active Directory 域和 IAM 角色。有关更多信息,请参阅 将 AWS Managed Active Directory 用于 RDS for SQL Server

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

注意

如果您使用现有的加入域数据库实例,则该实例必须已经关联了 Active Directory 域和 IAM 角色。如果您创建新的加入域实例,请指定现有的 Active Directory 域和 IAM 角色。有关更多信息,请参阅“将 AWS Managed Active Directory 用于 RDS for SQL Server”。

使用 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 \ --manage-master-user-password \ --master-username admin \ --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 ^ --manage-master-user-password ^ --master-username admin ^ --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)

使用 XA 事务

从 RDS for SQL Server 2017 版本 14.00.3223.3 开始,您可以使用 JDBC 控制分布式事务。当您在 MSDTC 选项将 Enable XA 选项设置为 true 时,RDS 会自动启用 JDBC 事务并授予 SqlJDBCXAUser 角色给 guest 用户。这允许通过 JDBC 执行分布式事务。有关包括代码示例在内的更多信息,请参阅 Microsoft 文档中的了解 XA 事务

使用事务跟踪

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 Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

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

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

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

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

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

  7. 选择删除

从其选项组中删除 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 for SQL Server 的 MSDTC 故障排除

在某些情况下,您可能无法在客户端计算机上运行的 MSDTC,与在 RDS for 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 防火墙。