MSDTCとは?SQL Serverで分散トランザクションを実現する方法
SQL ServerでMSDTCを有効にする方法
MSDTCを有効にする手順
-
サービスを開始する
- スタートメニューを開き、「サービス」と入力して検索します。
- 検索結果から「サービス」を開きます。
- サービスの一覧から「Microsoft 分散トランザクションコーディネーター」を見つけます。
- サービスを右クリックし、「開始」を選択します。
-
ファイアウォールを開放する
- コントロールパネルを開き、「システムとセキュリティ」を選択します。
- 「Windows Defenderファイアウォール」を選択します。
- 左側のメニューから「詳細設定」を選択します。
- 右側のペインで「MSDTC」という名前の規則を見つけます。
-
SQL Serverを構成する
- SQL Server Management Studioを開きます。
- オブジェクトエクスプローラーで、サーバーインスタンスを右クリックし、「プロパティ」を選択します。
- 「MSDTC」ノードを選択して、「OK」を選択します。
- 右側のペインで、「MSDTCを有効にする」チェックボックスをオンにします。
- 「OK」をクリックして変更を保存します。
注意事項
- MSDTCは、ネットワーク上で実行されている必要があります。
- MSDTCを使用する前に、ファイアウォールが適切に構成されていることを確認する必要があります。
- MSDTCは、高可用性クラスタリング環境では使用できません。
- MSDTCを使用する前に、MSDTCに関するドキュメントをよく読んで理解することをお勧めします。
- MSDTCを使用するアプリケーションの開発者は、MSDTCの使用方法に関するドキュメントを参照する必要があります。
using System;
using System.Data.SqlClient;
using System.Transactions;
namespace MSDTCExample
{
class Program
{
static void Main(string[] args)
{
// トランザクションを開始します。
using (var transaction = new TransactionScope())
{
// データベース1に接続します。
using (var connection1 = new SqlConnection("Data Source=localhost;Initial Catalog=Database1;Integrated Security=True"))
{
connection1.Open();
// データベース1のテーブルにデータを追加します。
var command1 = new SqlCommand("INSERT INTO Table1 (Name, Value) VALUES (@Name, @Value)", connection1);
command1.Parameters.AddWithValue("@Name", "Test");
command1.Parameters.AddWithValue("@Value", 1);
command1.ExecuteNonQuery();
}
// データベース2に接続します。
using (var connection2 = new SqlConnection("Data Source=localhost;Initial Catalog=Database2;Integrated Security=True"))
{
connection2.Open();
// データベース2のテーブルにデータを追加します。
var command2 = new SqlCommand("INSERT INTO Table2 (Name, Value) VALUES (@Name, @Value)", connection2);
command2.Parameters.AddWithValue("@Name", "Test");
command2.Parameters.AddWithValue("@Value", 1);
command2.ExecuteNonQuery();
}
// トランザクションをコミットします。
transaction.Complete();
}
Console.WriteLine("トランザクションが完了しました。");
}
}
}
このコードを実行するには、以下の条件が必要です。
- .NET Framework 4.5以降がインストールされていること
- SQL Server 2012以降がインストールされていること
- 2つのデータベース (Database1 と Database2) が存在すること
このコードを実行すると、2つのデータベースにそれぞれ1つのレコードが追加されます。トランザクションがコミットされるため、両方のデータベースの変更が保存されます。
注意: このコードはサンプルであり、実際のアプリケーションで使用するには変更する必要がある場合があります。
MSDTCを有効にする他の方法
- レジストリエディタを開きます。
- 次のキーに移動します。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSDTC
- AllowNetworkDtcAccess という DWORD 値を作成します。
- コンピュータを再起動します。
グループポリシーを使用する
ユーザーの構成 > 管理用テンプレート > コントロールパネル > 地域と言語 > 管理用ロケール > 分散トランザクションコーディネーター
- ネットワーク DTC アクセスを許可する というポリシーをダブルクリックします。
- 有効 を選択します。
- OK をクリックします。
スクリプトを使用する
PowerShell などのスクリプトを使用して、MSDTCを有効にすることもできます。
以下のスクリプトは、MSDTCを有効にする方法を示しています。
# サービスを開始する
Start-Service MSDTC
# ファイアウォールを開放する
New-NetFirewallRule -Name "MSDTC" -DisplayName "Microsoft Distributed Transaction Coordinator" -Protocol TCP -LocalPort 135 -Direction Inbound -Action Allow
# SQL Serverを構成する
Set-ItemProperty "HKLM:\Software\Microsoft\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQLServer" -Name "MSDTC" -Value 1 -Type DWORD
# コンピュータを再起動する
Restart-Computer
このスクリプトを実行するには、PowerShell 5.0以降が必要です。
- レジストリエディタまたはグループポリシーを使用する場合は、誤操作をするとシステムトラブルが発生する可能性があります。
- スクリプトを使用する場合は、スクリプトの内容をよく理解してから実行してください。
MSDTCを有効にする方法はいくつかあります。どの方法を使用するかは、環境や要件によって異なります。
sql-server msdtc