Membuat sumber daya DTC terkluster untuk grup ketersediaan AlwaysOn

Berlaku untuk:SQL Server - Hanya Windows

Artikel ini memandu Anda melalui konfigurasi lengkap sumber daya DTC berkluster untuk grup ketersediaan AlwaysOn (AG) SQL Server. Konfigurasi lengkap dapat memakan waktu hingga satu jam untuk diselesaikan.

Panduan ini membuat sumber daya DTC berkluster dan SQL Server AGs untuk menyelaraskan dengan persyaratan di Cara mengelompokkan layanan DTC untuk grup ketersediaan AlwaysOn.

Panduan ini menggunakan skrip PowerShell dan Transact-SQL (T-SQL). Banyak skrip T-SQL mengharuskan Mode SQLCMD diaktifkan. Untuk informasi selengkapnya tentang Mode SQLCMD, lihat Mengedit Skrip SQLCMD dengan Editor Kueri. Modul FailoverClusters PowerShell harus diimpor. Untuk informasi selengkapnya tentang mengimpor modul PowerShell, lihat Mengimpor Modul PowerShell. Panduan ini didasarkan pada opsi konfigurasi berikut:

  • Semua persyaratan dari Prasyarat, pembatasan, dan rekomendasi untuk grup ketersediaan AlwaysOn terpenuhi.
  • Domainnya adalah contoso.lab.
  • Pengguna memiliki izin Buat objek Komputer di unit organisasi tempat sumber daya Nama Jaringan DTC akan dibuat.
  • Pengguna adalah pengguna domain dengan hak administrator pada semua simpul dalam kluster.
  • Berbagi file yang disebut sqlbackups telah dibuat untuk pencadangan.
  • Instans default SQL Server diberi nama SQLNODE1 dan SQLNODE2.
  • Akun layanan yang sama digunakan pada semua instans SQL Server.
  • Pengguna adalah anggota sysadmin peran SQL Server tetap pada semua instans SQL Server.
  • Hasil default transaksi yang tidak dapat diselesaikan DTC akan diatur ke presume commit.
  • Titik akhir pencerminan akan menggunakan port 5022.
  • Tidak ada AG lain atau sumber daya DTC terkluster.
  • Detail kluster (Sudah Ada):
    • Nama: Cluster
    • Nama Jaringan: Cluster Network 1
    • Simpul: SQLNODE1, SQLNODE2
    • Penyimpanan bersama: Cluster Disk 3 (Dimiliki oleh SQLNODE1)
  • Detail kluster (Untuk dibuat):
    • Sumber daya Nama Jaringan: DTCnet1
    • Sumber daya Nama Jaringan DTC: DTC1
    • Sumber daya Disk Fisik DTC: DTCDisk1
    • IP DTC dan sumber daya subnet: 192.168.2.54, 255.255.255.0
    • Sumber daya IP DTC: DTCIP1

1. Periksa sistem operasi

Untuk transaksi terdistribusi yang didukung, grup ketersediaan AlwaysOn harus berjalan pada Windows Server 2012 R2 dan versi yang lebih baru. Untuk Windows Server 2012 R2, Anda harus menginstal pembaruan di KB3090973. Skrip ini memeriksa versi sistem operasi, menentukan apakah Anda perlu menginstal hotfix 3090973. Jalankan skrip PowerShell berikut ini di SQLNODE1.

# A few OS checks

<#
Script:
    1) is re-runnable
    2) will work on any node in the cluster, and
    3) will execute against every node in the cluster
#>

$nodes = (Get-ClusterNode).Name;
foreach ($node in $nodes) {

    # At least 2012 R2
    $os = (Get-WmiObject -class Win32_OperatingSystem -ComputerName $node).caption;
    if ($os -like "*2012 R2*" -or $os -like "*2016*" -or $os -like "*2019*" -or $os -like "*2022*") {
        Write-Host "$os is supported on $node.";
    }
    else {
        Write-Host "STOP! $os is not supported on $node.";
    }

    # KB 3090973
    if ($os -like "*2012 R2*") {
        $kb = Get-Hotfix -ComputerName $node | Where { $_.HotFixID -eq 'KB3090973' };
        if ($kb) {
            Write-Host "KB3090973 is installed on $node."
        }
        else {
            Write-Host "HotFixID KB3090973 must be applied on $node. See https://support.microsoft.com/help/3090973 for additional information and to download the hotfix.";
        }
    }
    else {
        Write-Host "KB3090973 does not apply to $os on $node."
    }
}

2. Mengonfigurasi aturan firewall

Skrip ini mengonfigurasi firewall untuk memungkinkan lalu lintas DTC pada setiap SQL Server yang menghosting replika AG, dan server lain yang terlibat dalam transaksi terdistribusi. Skrip juga mengonfigurasi firewall untuk memungkinkan koneksi untuk titik akhir pencerminan database. Jalankan skrip PowerShell berikut ini di SQLNODE1.

# Configure Firewall

<#
Script:
    1) is re-runnable
    2) will work on any node in the cluster, and
    3) will execute against every node in the cluster
#>

$nodes = (Get-ClusterNode).Name;
foreach ($node in $nodes) {
    Get-NetFirewallRule -CimSession $node -DisplayGroup 'Distributed Transaction Coordinator' -Enabled False -ErrorAction SilentlyContinue | Enable-NetFirewallRule;
    New-NetFirewallRule -CimSession $node -DisplayName 'SQL Server Mirroring' -Description 'Port 5022 for SQL Server Mirroring' -Action Allow -Direction Inbound -Protocol TCP -LocalPort 5022 -RemotePort Any -LocalAddress Any -RemoteAddress Any;
};

3. Mengonfigurasi resolusi xact yang ragu

Skrip ini mengonfigurasi opsi konfigurasi server resolusi xact yang ragu untuk "penerapan presume" untuk transaksi yang meragukan.

Jalankan skrip T-SQL berikut di SQL Server Management Studio (SSMS) terhadap SQLNODE1 dalam mode SQLCMD.

/*******************************************************************
    Execute script in its entirety on SQLNODE1 in SQLCMD mode
*******************************************************************/
-- Configure in-doubt xact resolution on all SQL Server instances to presume commit
IF (
    SELECT CAST(value_in_use AS BIT)
    FROM sys.configurations WITH (NOLOCK)
    WHERE [name] = N'show advanced options'
) = 0
BEGIN
    EXEC sp_configure 'show advanced options', 1;
    RECONFIGURE;
END

-- Configure the server to presume commit for in-doubt transactions.
IF (
    SELECT CAST(value AS BIT)
    FROM sys.configurations WITH (NOLOCK)
    WHERE [name] = N'in-doubt xact resolution'
) <> 1
BEGIN
    EXEC sp_configure 'in-doubt xact resolution', 1;
    RECONFIGURE;
END
GO

-----------------------------------------------------------------------------
:connect SQLNODE2

IF (
    SELECT CAST(value_in_use AS BIT)
    FROM sys.configurations WITH (NOLOCK)
    WHERE [name] = N'show advanced options'
) = 0
BEGIN
    EXEC sp_configure 'show advanced options', 1;
    RECONFIGURE;
END

-- Configure the server to presume commit for in-doubt transactions.
IF (
    SELECT CAST(value AS BIT)
    FROM sys.configurations WITH (NOLOCK)
    WHERE [name] = N'in-doubt xact resolution'
) <> 1
BEGIN
    EXEC sp_configure 'in-doubt xact resolution', 1;
    RECONFIGURE;
END
GO

4. Membuat database pengujian

Skrip membuat database bernama AG1 di SQLNODE1 dan database bernama dtcDemoAG1 di SQLNODE2. Jalankan skrip T-SQL berikut di SSMS terhadap SQLNODE1 dalam mode SQLCMD.

/*******************************************************************
    Execute script in its entirety on SQLNODE1 in SQLCMD mode
*******************************************************************/
-- On SQLNODE1
USE master;
GO

SET NOCOUNT ON;

IF EXISTS (
    SELECT *
    FROM sys.databases
    WHERE name = N'AG1'
)
BEGIN
    DROP DATABASE AG1;
END
GO

CREATE DATABASE AG1;
GO

ALTER DATABASE AG1
SET RECOVERY FULL WITH NO_WAIT;

ALTER AUTHORIZATION ON DATABASE::AG1 TO sa;
GO

USE AG1;

CREATE TABLE [dbo].[Names] (
    [Name] [varchar](64) NULL,
    [EditDate] DATETIME
);

INSERT [dbo].[Names]
VALUES ('AG1', GETDATE());
GO

-- Against SQNODE2
:connect SQLNODE2

USE master;
GO

SET NOCOUNT ON;

IF EXISTS (
    SELECT *
    FROM sys.databases
    WHERE name = N'dtcDemoAG1'
)
BEGIN
    DROP DATABASE dtcDemoAG1;
END
GO

CREATE DATABASE dtcDemoAG1;
GO

ALTER DATABASE dtcDemoAG1
SET RECOVERY SIMPLE WITH NO_WAIT;

ALTER AUTHORIZATION ON DATABASE::dtcDemoAG1 TO sa;
GO

USE dtcDemoAG1;
GO

CREATE TABLE [dbo].[Names] (
    [Name] [varchar](64) NULL,
    [EditDate] DATETIME
);
GO

5. Buat titik akhir

Skrip ini membuat titik akhir yang disebut AG1_endpoint yang mendengarkan pada port 5022TCP . Jalankan skrip T-SQL berikut di SSMS terhadap SQLNODE1 dalam mode SQLCMD.

/**********************************************
Execute on SQLNODE1 in SQLCMD mode
**********************************************/
-- Create endpoint on the server instance that hosts the primary replica:
IF NOT EXISTS (SELECT * FROM sys.database_mirroring_endpoints)
BEGIN
    CREATE ENDPOINT AG1_endpoint AUTHORIZATION [sa]
        STATE = STARTED
        AS TCP (LISTENER_PORT = 5022)
    FOR DATABASE_MIRRORING(ROLE = ALL);
END
GO

-----------------------------------------------------------------------------
:connect SQLNODE2

IF NOT EXISTS (SELECT *FROM sys.database_mirroring_endpoints)
BEGIN
    CREATE ENDPOINT AG1_endpoint AUTHORIZATION [sa]
        STATE = STARTED
        AS TCP (LISTENER_PORT = 5022)
    FOR DATABASE_MIRRORING(ROLE = ALL);
END
GO

6. Siapkan database untuk grup ketersediaan

Skrip mencadangkan AG1SQLNODE1 dan memulihkannya ke SQLNODE2. Jalankan skrip T-SQL berikut di SSMS terhadap SQLNODE1 dalam mode SQLCMD.

/*******************************************************************
    Execute script in its entirety on SQLNODE1 in SQLCMD mode
*******************************************************************/
-- Backup database
BACKUP DATABASE AG1 TO DISK = N'\\sqlnode1\sqlbackups\AG1.bak'
WITH FORMAT, STATS = 10;

-- Backup transaction log
BACKUP LOG AG1 TO DISK = N'\\sqlnode1\sqlbackups\AG1_Log.bak'
WITH FORMAT, STATS = 10;
GO

-- Restore database and logs on secondary WITH NORECOVERY
:connect SQLNODE2

USE [master];
GO

RESTORE DATABASE AG1
FROM DISK = N'\\sqlnode1\sqlbackups\AG1.bak'
WITH NORECOVERY, STATS = 10;

RESTORE LOG AG1
FROM DISK = N'\\sqlnode1\sqlbackups\AG1_Log.bak'
WITH NORECOVERY, STATS = 10;
GO

7. Membuat grup ketersediaan

Grup ketersediaan AlwaysOn harus dibuat dengan CREATE AVAILABILITY GROUP perintah dan WITH DTC_SUPPORT = PER_DB klausa. Saat ini Anda tidak dapat mengubah AG yang ada. Wizard Grup Ketersediaan Baru tidak memungkinkan Anda mengaktifkan dukungan DTC untuk AG baru. Skrip berikut membuat AG baru dan bergabung dengan sekunder. Jalankan skrip T-SQL berikut di SSMS terhadap SQLNODE1 dalam mode SQLCMD.

/*******************************************************************
    Execute the script in its entirety on SQLNODE1 in SQLCMD mode
*******************************************************************/
--  Create availability group on SQLNODE1
USE master;
GO

CREATE AVAILABILITY GROUP DTCAG1
WITH (DTC_SUPPORT = PER_DB)
FOR DATABASE AG1 REPLICA ON
'SQLNODE1' WITH (
    ENDPOINT_URL = 'TCP://SQLNODE1.contoso.lab:5022',
    AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
    FAILOVER_MODE = MANUAL
),
'SQLNODE2' WITH (
    ENDPOINT_URL = 'TCP://SQLNODE2.contoso.lab:5022',
    AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
    FAILOVER_MODE = MANUAL
);
GO

-- SQLNODE2
-- Join a secondary replica to the availability group
:connect SQLNODE2

ALTER AVAILABILITY GROUP DTCag1 JOIN;

-- Join the database to the availability group
ALTER DATABASE AG1
SET HADR AVAILABILITY GROUP = DTCAG1;
GO

Dimulai dengan SQL Server 2016 (13.x) Paket Layanan 2, Anda dapat mengubah AG untuk transaksi terdistribusi. Untuk versi SQL Server 2016 (13.x) sebelum Paket Layanan 2, Anda tidak dapat mengaktifkan DTC pada grup ketersediaan AlwaysOn yang ada. SQL Server menerima sintaks berikut untuk AG yang ada:

USE master;
GO
ALTER AVAILABILITY GROUP <availability_group>
SET (DTC_Support = Per_DB);

Namun, tidak ada perubahan konfigurasi yang dilakukan. Anda dapat mengonfirmasi konfigurasi dtc_support dengan kueri T-SQL berikut:

SELECT name, dtc_support FROM sys.availability_groups; 

Satu-satunya cara untuk mengaktifkan dukungan DTC pada AG untuk versi sebelum versi SQL Server 2016 (13.x) sebelum Paket Layanan 2, adalah dengan membuat AG menggunakan Transact-SQL.

8. Siapkan sumber daya kluster

Skrip ini menyiapkan sumber daya dependen DTC: Disk dan IP. Penyimpanan bersama ditambahkan ke Kluster Windows. Sumber daya jaringan dibuat, lalu DTC dibuat dan dibuat sebagai sumber daya ke AG. Jalankan skrip PowerShell berikut ini di SQLNODE1. Skrip ini didasarkan pada sampel yang terletak di Cara Mengonfigurasi DTC dengan Benar untuk Instans Terkluster SQL Server (Direvisi).

# Create a clustered Microsoft Distributed Transaction Coordinator properly in the resource group with SQL Server

<#----------------------------------- Begin User Input -----------------------------------#>
$AGgrp = "DTCag1"; # Name of the WSFC resource group that will contain the DTC resource

$WSFC = (Get-Cluster).Name; # Windows Failover Cluster name
$DTCnetwk = "Cluster Network 1" # WSFC Network to use for the DTC IP address

$ClusterAvailableDisk = "Cluster Disk 3"; # Designated disk that can support failover clustering and is visible to all nodes but not yet part of the set of clustered disks
$DTCdisk = "DTCDisk1"; # Name of the disk to be used with DTC

$DTCipresnm = "DTCIP1"; # WSFC Friendly Name of the DTC's IP resource
$DTCipaddr = "192.168.2.54"; # IP address of the DTC resource
$DTCsubnet = "255.255.255.0"; # Subnet for the DTC IP address
$DTCnetnm = "DTCNet1"; # WSFC Friendly Name of the Network Name resource
$DTCresnm = "DTC1"; # Name of the WSFC DTC Network Name resource; Name must be unique in AD
<#------------------------------------ End User Input ------------------------------------#>

# Make a new disk available for use in a failover cluster.
Get-ClusterAvailableDisk | Where-Object { $_.Name -eq $ClusterAvailableDisk } | Add-ClusterDisk;

# Rename disk
$resource = Get-ClusterResource $ClusterAvailableDisk; $resource.Name = $DTCdisk;

# Create the IP resource
Add-ClusterResource -Name $DTCipresnm -ResourceType "IP Address" -Group $AGgrp;

# Set the network to use, IP address, and subnet
# All three have to be configured at the same time
$DTCIPres = Get-ClusterResource $DTCipresnm;
$ntwk = New-Object Microsoft.FailoverClusters.PowerShell.ClusterParameter $DTCipres, Network, $DTCnetwk;
$ipaddr = New-Object Microsoft.FailoverClusters.PowerShell.ClusterParameter $DTCipres, Address, $DTCipaddr;
$subnet = New-Object Microsoft.FailoverClusters.PowerShell.ClusterParameter $DTCipres, SubnetMask, $dtcsubnet;

$setdtcipparams = $ntwk, $ipaddr, $subnet;
$setdtcipparams | Set-ClusterParameter;

# Create the Network Name resource
Add-ClusterResource $DTCnetnm -ResourceType "Network Name" -Group $AGgrp;

# Set the value for the Network Name resource
Get-ClusterResource $DTCnetnm | Set-ClusterParameter DnsName $DTCresnm;

# Add the IP address as a depenency of the Network Name resource
Add-ClusterResourceDependency $DTCnetnm $DTCipresnm;

# Create the Distributed Transaction Coordinator resource
Add-ClusterResource $DTCresnm -ResourceType "Distributed Transaction Coordinator" -Group $AGgrp;

# Add the Network Name as a dependency of the DTC resource
Add-ClusterResourceDependency $DTCresnm $DTCnetnm;

# Move the disk into the resource group with SQL Server
Move-ClusterResource -Name $DTCdisk -Group $AGgrp;

# Add the disk as a dependency of the DTC resource
Add-ClusterResourceDependency $DTCresnm $DTCdisk;

# Bring the IP resource online
Start-ClusterResource $DTCipresnm;

# Bring the Network Name resource online
Start-ClusterResource $DTCnetnm;

# Bring the DTC resource online
Start-ClusterResource $DTCresnm;

9. Aktifkan akses DTC Jaringan

Skrip berikut memungkinkan Akses DTC Jaringan untuk layanan DTC berkluster untuk memungkinkan komputer jarak jauh mendaftarkan transaksi terdistribusi melalui jaringan. Jalankan skrip PowerShell berikut ini di SQLNODE1.

# Enable Network DTC access for the clustered DTC service

<#
Script:
    1) is re-runnable
    2) will work on any node in the cluster, and
    3) will execute against every node in the cluster
#>

# Enter the Name of DTC resource

$DtcName = "DTC1";
<# ------- End of User Input ------- #>

[bool]$restart = 0;
$node = (Get-ClusterResource -Name $DtcName).OwnerNode.Name;
$DtcSettings = Get-DtcNetworkSetting -DtcName $DtcName;

if ($DtcSettings.InboundTransactionsEnabled -eq $false) {
    Set-DtcNetworkSetting -CimSession $node -DtcName $DtcName -AuthenticationLevel "Mutual" -InboundTransactionsEnabled $true -Confirm:$false;
    $restart = 1;
}

if ($DtcSettings.OutboundTransactionsEnabled -eq $false) {
    Set-DtcNetworkSetting -CimSession $node -DtcName $DtcName -AuthenticationLevel "Mutual" -OutboundTransactionsEnabled $true -Confirm:$false;
    $restart = 1;
}

if ($restart -eq 1) {
    Stop-Dtc -CimSession $node -DtcName $DTCname -Confirm:$false;
    Start-Dtc -CimSession $node -DtcName $DTCname;
}

10. Nonaktifkan dan hentikan layanan DTC lokal pada setiap simpul

Nonaktifkan DTC lokal pada kedua simpul untuk menjamin bahwa transaksi terdistribusi menggunakan sumber daya DTC berkluster. Skrip berikut menonaktifkan dan menghentikan layanan DTC lokal pada setiap simpul. Jalankan skrip PowerShell berikut ini di SQLNODE1.

# Disable local DTC service

<#
Script:
    1) is re-runnable
    2) will work on any node in the cluster, and
    3) will execute against every node in the cluster
#>

$DTCname = 'Local';
$nodes = (Get-ClusterNode).Name;

foreach ($node in $nodes) {

    $service = Get-WmiObject -class Win32_Service -computername $node -Filter "Name='MSDTC'";
    if ($service.StartMode -ne 'Disabled') {
        $service.ChangeStartMode('Disabled');
    }

    if ($service.State -ne 'Stopped') {
        $service.StopService();
    }
}

11. Siklus layanan SQL Server untuk setiap instans

Dengan layanan DTC terkluster yang dikonfigurasi sepenuhnya, Anda perlu menghentikan dan memulai ulang setiap instans SQL Server di AG untuk memastikan SQL Server terdaftar untuk menggunakan layanan DTC ini.

Pertama kali layanan SQL Server memerlukan transaksi terdistribusi. Ini mendaftar dengan layanan DTC. Layanan SQL Server terus menggunakan layanan DTC tersebut hingga dimulai ulang. Jika layanan DTC terkluster tersedia, SQL Server mendaftar dengan layanan DTC berkluster. Jika layanan DTC terkluster tidak tersedia, SQL Server mendaftar dengan layanan DTC lokal. Untuk memverifikasi bahwa SQL Server mendaftar dengan layanan DTC terkluster, hentikan dan mulai ulang setiap instans SQL Server.

Ikuti langkah-langkah yang terkandung dalam skrip T-SQL berikut:

/*
Gracefully cycle the SQL Server service and failover the availability group
    a.    On SQLNODE2, cycle the SQL Server service from SQL Server Configuration Manager

    b.    On SQLNODE2 failover, the availability group to SQLNODE2
        Execute the T-SQL script below on SQLNODE2 (Use Results to Text)

    c.    On SQLNODE1, cycle the SQL Server service from SQL Server Configuration Manager

    d.    On SQLNODE1, failover the availability group to SQLNODE1 once the databases are back in sync.
        Execute the T-SQL script below on SQLNODE1 (Use Results to Text)
*/
SET NOCOUNT ON;

-- Ensure replica is secondary
IF (
    SELECT rs.is_primary_replica
    FROM sys.availability_groups ag
    INNER JOIN sys.dm_hadr_database_replica_states rs
        ON ag.group_id = rs.group_id
    WHERE ag.name = N'DTCag1' AND rs.is_local = 1
) = 0
BEGIN
    -- Wait for SYNCHRONIZED state
    DECLARE @ctr TINYINT = 0;
    DECLARE @msg VARCHAR(128);

    WHILE (
        SELECT synchronization_state
        FROM sys.availability_groups ag
        INNER JOIN sys.dm_hadr_database_replica_states rs
            ON ag.group_id = rs.group_id
        WHERE ag.name = N'DTCag1'
            AND rs.is_primary_replica = 0
            AND rs.is_local = 1
    ) <> 2
    BEGIN
        WAITFOR DELAY '00:00:01';

        SET @ctr += 1;
        SET @msg = 'Waiting for databases to become synchronized. Duration in seconds: ' + cast(@ctr AS VARCHAR(3));

        RAISERROR (@msg, 0, 1) WITH NOWAIT;
    END;

    ALTER AVAILABILITY GROUP DTCAG1 FAILOVER;
    SELECT 'Failover complete' AS [Sucess];
END;
ELSE
BEGIN
    SELECT 'This instance is the primary replica. Connect to the secondary replica and try again.' AS [Error];
END;

12. Konfigurasi pengujian

Pengujian ini menggunakan server tertaut dari SQLNODE1 ke SQLNODE2 untuk membuat transaksi terdistribusi. Pastikan replika utama AG aktif SQLNODE1. Untuk menguji konfigurasi, Anda akan:

  • Buat server yang ditautkan
  • Menjalankan transaksi terdistribusi

Buat server yang ditautkan

Skrip berikut membuat dua server tertaut di SQLNODE1. Jalankan skrip T-SQL berikut di SSMS terhadap SQLNODE1.

-- SQLNODE1
IF NOT EXISTS (SELECT * FROM sys.servers WHERE name = N'SQLNODE1')
BEGIN
    EXEC master.dbo.sp_addlinkedserver @server = N'SQLNODE1';
END

IF NOT EXISTS (SELECT * FROM sys.servers WHERE name = N'SQLNODE2')
BEGIN
    EXEC master.dbo.sp_addlinkedserver @server = N'SQLNODE2';
END

Menjalankan transaksi terdistribusi

Skrip ini pertama kali mengembalikan statistik transaksi DTC saat ini. Kemudian skrip menjalankan transaksi terdistribusi yang menggunakan database pada SQLNODE1 dan SQLNODE2. Kemudian skrip mengembalikan statis transaksi DTC, yang sekarang harus meningkatkan jumlah. Sambungkan SQLNODE1 dan jalankan skrip T-SQL berikut secara fisik di SQLCMS dalam SQLNODE1 mode SQLCMD.

/*******************************************************************
    Execute the script in its entirety on SQLNODE1 in SQLCMD mode
    Must be physically connected to SQLNODE1
*******************************************************************/
USE AG1;
GO
SET NOCOUNT ON;

-- Get Baseline
!! Powershell; $DtcNameC = Get-DtcClusterDefault; Get-DtcTransactionsStatistics -DtcName $DtcNameC;

SET XACT_ABORT ON
BEGIN DISTRIBUTED TRANSACTION
    INSERT INTO SQLNODE1.[AG1].[dbo].[Names] VALUES ('TestValue1', GETDATE());
    INSERT INTO SQLNODE2.[dtcDemoAG1].[dbo].[Names] VALUES ('TestValue2', GETDATE());
COMMIT TRAN
GO

-- Review DTC Transaction Statistics
!! Powershell; $DtcNameC = Get-DtcClusterDefault; Get-DtcTransactionsStatistics -DtcName $DtcNameC;

Penting

Pernyataan USE AG1 harus dijalankan untuk memastikan konteks database diatur ke AG1. Jika tidak, Anda akan menerima pesan kesalahan berikut: "Konteks transaksi yang digunakan oleh sesi lain."