你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

适用于 Azure SQL 托管实例的分布式事务处理协调器 (DTC)

适用于: Azure SQL 托管实例

本文概述了适用于 Azure SQL 托管实例的分布式事务处理协调器 (DTC)。 可以使用 DTC 在混合环境中运行分布式事务,包括跨托管实例、SQL Server 实例、其他关系数据库管理系统 (RDBMS)、自定义应用程序,以及托管在任何能与 Azure 建立网络连接的环境中的其他事务参与者。

方案

可以启用适用于 Azure SQL 托管实例的 DTC 跨多个能与 Azure 建立网络连接的环境运行分布式事务。 适用于 SQL 托管实例的 DTC 为托管式,这意味着 Azure 负责管理和维护,例如日志记录、存储、DTC 可用性和网络。 除了托管方面,适用于 SQL 托管实例的 DTC 与支持 SQL Server 传统分布式事务的 DTC Windows 服务相同。

适用于 SQL 托管实例的 DTC 解锁各种技术和方案,包括 XA、.NET、T-SQL、COM+、ODBC 和 JDBC。

若要运行分布式事务,请完成以下任务:

  1. 配置 DTC。
  2. 建立参与者之间的网络连接。
  3. 配置 DNS 设置。

注意

对于仅由托管实例托管的跨数据库的 T-SQL 或 .NET 分布式事务,建议使用对分布式事务的本机支持

要求

若要更改 DTC 设置,必须具有 Microsoft.Sql/managedInstances/dtc 资源的写入权限。 若要查看 DTC 设置,必须具有 Microsoft.Sql/managedInstances/dtc 资源的读取权限。

配置 DTC

可以使用 Azure 门户、Azure PowerShell 和 CLI 配置 DTC。

若要使用 Azure 门户配置 DTC:

  1. Azure 门户中,转到托管实例。

  2. 在左侧菜单的“设置”下,选择“分布式事务处理协调器”。

    屏幕截图显示突出显示的菜单选项、SQL 托管实例的“分布式事务处理协调器”窗格和“基本信息”选项卡。

  3. 在“基本信息”选项卡上,将“分布式事务处理协调器”设置为“启用”。

  4. 在“安全性”选项卡上,允许入站或出站事务,并启用 XA 或 SNA LU。

  5. 在“网络”选项卡上,指定 DTC DNS,并获取用于配置外部 DNS 和网络的信息。

网络连接

若要使用 DTC,所有事务参与者都必须具有到 Azure 的网络连接。 由于托管实例始终部署到 Azure 中的专用虚拟网络,因此必须将外部环境连接到托管实例的虚拟网络。 在此上下文中,外部是指不是托管实例的任何对象或进程。 如果外部资源也使用 Azure 中的虚拟网络,则可以使用虚拟网络对等互连。 否则,请使用首选方法建立连接,例如点到站点 VPN、Azure ExpressRoute,或其他可满足业务需求的网络连接技术。

在托管实例的虚拟网络网络安全组和外部环境中设置的任何防火墙中,端口 135 必须同时允许入站和出站通信,端口范围 14000-15000 必须允许入站通信,49152-65535 必须允许出站通信。

DNS 设置

DTC 依赖于事务参与者的 NetBIOS 名称进行相互通信。 因为 NetBIOS 协议不受 Azure 网络支持,且 NetBIOS 名称无法在混合环境中得到解析,所以适用于托管实例的 DTC 要依靠 DNS 名称服务器进行主机名解析。 托管实例 DTC 主机会自动注册到 Azure DNS 服务器。 必须使用 DNS 服务器注册外部 DTC 主机。 托管实例和外部环境还必须交换 DNS 后缀。

下图显示了跨混合环境的名称解析:

显示使用 DTC 时的跨混合环境的名称解析的示意图。

注意

如果计划仅对 XA 事务使用 DTC,则无需配置 DNS 设置。

若要交换 DNS 后缀:

  1. Azure 门户中,转到托管实例。

  2. 在左侧菜单的“设置”下,选择“分布式事务处理协调器”。 选择“网络”选项卡。

    屏幕截图显示 Azure 门户中托管实例 DTC 页面的“网络”选项卡,其中突出显示“新建外部 DNS 后缀”。

  3. 在“DNS 配置”中,选择“新建外部 DNS 后缀”。 为外部环境输入 DNS 后缀,例如 dnszone1.com

  4. 复制“DTC 主机 DNS 后缀”的值。 然后在外部环境中使用 PowerShell 命令 Set-DnsClientGlobalSetting -SuffixSearchList $list 设置 DTC 主机 DNS 后缀。 例如,如果后缀为 abc1111111.database.windows.net,请定义 $list 参数以获取现有 DNS 设置。 然后,向其追加后缀,如以下示例所示:

    $list = (Get-DnsClientGlobalSetting).SuffixSearchList + "abc1111111.database.windows.net"
    Set-DnsClientGlobalSetting -SuffixSearchList $list
    

测试网络连接

配置网络和 DNS 后,在托管实例的 DTC 终结点与外部 DTC 主机之间运行 Test-NetConnection (TNC)

若要测试连接,首先更新用户可配置的值。 然后,在外部环境中使用以下 PowerShell 脚本来标识 DTC 主机托管实例的完全限定的域名 (FQDN)。 下面是一个示例:

# =============================================================== 
# Get DTC settings 
# =============================================================== 
# User-configurable values 
# 

$SubscriptionId = "a1a1a1a1-8372-1d28-a111-1a2a31a1a1a1" 
$RgName = "my-resource-group" 
$MIName = "my-instance-name" 

# =============================================================== 
# 

$startMoveUri = "https://management.azure.com/subscriptions/" + $SubscriptionId + "/resourceGroups/" + $RgName + "/providers/Microsoft.Sql/managedInstances/" + $MIName + "/dtc/current?api-version=2022-05-01-preview" 
Write-Host "Sign in to Azure subscription $SubscriptionID ..." 
Select-AzSubscription -SubscriptionName $SubscriptionID 
$azContext = Get-AzContext 
$azProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile 
$profileClient = New-Object -TypeName Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient -ArgumentList ($azProfile) 
Write-Host "Getting authentication token for REST API call ..." 
$token = $profileClient.AcquireAccessToken($azContext.Subscription.TenantId) 
$authHeader = @{'Content-Type'='application/json';'Authorization'='Bearer ' + $token.AccessToken} 


# Invoke API call to start the operation 
# 

Write-Host "Starting API call..." 
$startMoveResp = Invoke-WebRequest -Method Get -Headers $authHeader -Uri $startMoveUri 
Write-Host "Response:" $startMoveResp 

# End 
# =============================================================== 

JSON 输出如以下示例 FQDN 所示:

chn000000000000.zcn111111111.database.windows.net

其中:

  • chn000000000000 是托管实例 DTC 主机的 NetBIOS 名称。
  • zcn111111111.database.windows.net 是 DNS 后缀。

接下来,对端口 135 上托管实例 DTC 主机的 FQDN 和 NetBIOS 名称运行 TNC。 在以下示例中,第一个条目验证网络连接。 第二个条目验证 DNS 设置是否正确。

tnc chn000000000000.zcn111111111.database.windows.net -Port 135 
tnc chn000000000000 -Port 135 

如果正确配置连接和 DNS 后缀,则会看到输出 TcpTestSucceeded : True。

在托管实例端,创建 SQL 代理作业,运行 TNC PowerShell 命令,以测试与外部主机的连接。

例如,如果外部主机的 FQDN 为 host10.dnszone1.com,则通过 SQL 代理作业运行以下测试:

tnc host10.dnszone1.com -Port 135 
tnc host10 -Port 135 

限制

将 DTC 与 SQL 托管实例配合使用时,请考虑以下限制:

  • 不支持在 SQL 托管实例和第三方 RDBMS 之间运行分布式 T-SQL 事务。 SQL 托管实例不支持具有第三方 RDBMS 的链接服务器。 与之相对是支持在托管实例和 SQL Server 和其他基于 SQL Server 的产品之间运行分布式 T-SQL 事务。
  • 外部环境中的主机名不能超过 15 个字符。
  • DTC 不支持指向 Azure SQL 数据库的分布式事务。
  • 对于身份验证,DTC 仅支持无身份验证选项。 相互身份验证和传入调用方身份验证选项不可用。 由于 DTC 仅交换同步消息而不交换用户数据,并且它仅与虚拟网络通信,因此此限制不会带来安全风险。

管理事务

若要查看分布式事务的统计信息,请参阅 sys.dm_tran_distributed_transaction_stats

可以使用 sp_reset_dtc_log 存储过程重置 DTC 日志。

可以使用 sys.sp_manage_distributed_transaction 存储过程管理分布式事务。

后续步骤

若要了解本机托管实例分布式事务支持,请参阅弹性事务