共用方式為


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

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

本文提供適用於 Azure SQL 受控執行個體的分散式交易協調器 (DTC) 概觀。 您可以使用 DTC 在混合環境中執行分散式交易。 其中包括跨 SQL 受控執行個體、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 設定。

注意

針對僅由 SQL 受控執行個體裝載之資料庫的 T-SQL 或 .NET 分散式交易,建議您使用 分散式交易的原生支援

需求

若要變更 DTC 設定,您必須具有資源的 Microsoft.Sql/managedInstances/dtc 寫入權限。 若要檢視 DTC 設定,您必須具有資源的 Microsoft.Sql/managedInstances/dtc 讀取權限。

連接埠 135 必須同時允許輸入和輸出通訊,連接埠範圍 14000-15000 必須允許輸入,而 49152-65535 必須允許 SQL 受控執行個體的虛擬網路 網路安全性群組 和外部環境中設定的任何防火牆中的輸出通訊。

設定 DTC

您可以使用 Azure 入口網站、Azure PowerShell 和 Azure CLI 來設定 DTC。

若要使用 Azure 入口網站設定 DTC,請遵循下列步驟:

  1. Azure 入口網站中,移至您的 SQL 受控執行個體。

  2. [設定] 底下,選取 [分散式交易協調器]。

    顯示醒目提示的功能表選項、SQL 受控執行個體的 [分散式交易協調器] 窗格,以及 [基本] 索引標籤的螢幕擷取畫面。

  3. 在 [基本] 索引標籤上,將 [分散式交易協調器] 設定為 [已啟用]。

  4. 在 [安全性] 索引標籤上,允許輸入或輸出交易,並啟用 XA 或 SNA LU。

  5. 在 [網路] 索引標籤上,指定 DTC DNS,並取得設定外部 DNS 和網路的資訊。

網路連線

若要使用 DTC,所有交易參與者都必須有與 Azure 的網路連線。 由於 SQL 受控執行個體一律會部署至 Azure 中的專用虛擬網路,因此您必須將外部環境連線到 SQL 受控執行個體的虛擬網路。 在此內容中, 外部 是指不是 SQL 受控執行個體的任何物件或進程。 如果您的外部資源也使用 Azure 中的虛擬網路,您可以使用虛擬網路對等互連。 否則,使用您慣用的方法建立連線,例如點對站 VPN、Azure ExpressRoute,或其他符合您業務需求的網路連線技術。

連接埠 135 必須同時允許輸入和輸出通訊,連接埠範圍 14000-15000 必須允許輸入,而 49152-65535 必須允許 SQL 受控執行個體的虛擬網路 網路安全性群組 和外部環境中設定的任何防火牆中的輸出通訊。

DNS 設定

DTC 依賴交易參與者的 NetBIOS 名稱進行相互通訊。 由於 Azure 網路不支援 NetBIOS 通訊協定,而且無法在混合環境中解析 NetBIOS 名稱,因此 SQL 受控執行個體的 DTC 依賴 DNS 名稱伺服器來解析主機名稱。 SQL 受控執行個體 DTC 主機會自動向 Azure DNS 伺服器註冊。 您必須向 DNS 伺服器註冊外部 DTC 主機。 SQL 受控執行個體和外部環境也必須交換 DNS 尾碼。

下圖顯示混合環境間的名稱解析:

此圖顯示使用 DTC 時混合環境間的名稱解析。

注意

如果您打算只針對 XA 交易使用 DTC,則不需要設定 DNS 設定。

若要交換 DNS 尾碼:

  1. Azure 入口網站中,移至您的 SQL 受控執行個體。

  2. [設定] 底下,選取 [分散式交易協調器],然後選取 [ 網路 ] 索引標籤。

    螢幕擷取畫面,顯示 Azure 入口網站中 SQL 受控執行個體的 [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 之後,請在 SQL 受控執行個體的 DTC 端點與外部 DTC 主機之間執行 Test-NetConnection (TNC)。

若要測試連線,請先更新使用者可設定的值。 然後,在外部環境中使用下列 PowerShell 腳本來識別 DTC 主機 SQL 受控執行個體的完整網域名稱 (FQDN)。 以下為範例:

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

$SubscriptionId = "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"
$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 是 SQL 受控執行個體 DTC 主機的 NetBIOS 名稱。
  • zcn111111111.database.windows.net 是 DNS 尾碼。

接下來,在埠 135 上對 SQL 受控執行個體 DTC 主機的 FQDN 和 NetBIOS 名稱執行 TNC。 在以下範例中,第一個項目會驗證網路連線能力。 第二個項目會驗證 DNS 設定是否正確。

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

如果已正確設定連線和 DNS 尾碼,會顯示輸出 TcpTestSucceeded : True

在 SQL 受控執行個體端,建立 SQL 代理程式作業以執行 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 受控執行個體與 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 預存程式進行管理。

後續步驟