適用於 Azure SQL 受控執行個體的分散式交易協調器 (DTC)

適用於:Azure SQL 受控執行個體

本文提供適用於 Azure SQL 受控執行個體的分散式交易協調器 (DTC) 概觀。 您可以使用 DTC 以在混合環境中執行分散式交易,包括遍及受控執行個體、SQL Server 執行個體、其他關聯式資料庫管理系統 (RDBMS)、自訂應用程式,以及任何可建立 Azure 網路連線的環境中所裝載的其他交易參與者。

注意

適用於 Azure SQL 受控執行個體的 DTC 屬於 2022 年 11 月功能潮。 若要深入了解功能潮推出的時間軸,請參閱 2022 年 11 月功能潮 (英文)

案例

您可以啟用適用於 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 名稱進行相互通訊。 由於 Azure 網路不支援 NetBIOS 通訊協定,且無法在混合環境中解析 NetBIOS 名稱,因此適用於受控執行個體的 DTC 依賴 DNS 名稱伺服器進行主機名稱解析。 系統會自動向 Azure DNS 伺服器註冊受控執行個體 DTC 主機。 您必須向 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 Agent 工作,執行 TNC PowerShell 命令,以測試與外部主機的連線。

舉例來說,如果外部主機的 FQDN 是 host10.dnszone1.com,請透過 SQL Agent 工作執行以下測試:

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

限制

搭配 SQL 受控執行個體使用 DTC 時,請考慮下列限制:

  • 不支援在 SQL 受控執行個體和協力廠商 RDBMS 之間執行分散式 T-SQL 交易。 SQL 受控執行個體不支援具有協力廠商 RDBMS 的連結伺服器。 相反地,支援在受控執行個體與 SQL Server 和其他 SQL Server 型產品之間執行分散式 T-SQL 交易。
  • 外部環境中的主機名稱不能超過 15 個字元。
  • DTC 不支援往 Azure SQL Database 的分散式交易。
  • 針對驗證,DTC 僅支援 [無驗證] 選項。 無法使用相互驗證和連入呼叫者驗證選項。 因為 DTC 只會交換同步處理訊息,不會交換使用者資料,而且因只會與虛擬網路通訊,所以這項限制不是安全性風險。

管理交易

若要檢視分散式交易的統計資料,請參閱 sys.dm_tran_distributed_transaction_stats

您可以使用 sp_reset_dtc_log 預存程式重設 DTC 記錄。

分散式交易可以使用 sys.sp_manage_distributed_transaction 預存程式進行管理。

下一步

如需原生受控執行個體分散式交易支援,請參閱彈性交易 (機器翻譯)