Azure SQL Database で Elastic Database Transactions の一般提供を開始
執筆者: Torsten Grabs (Principal Program Manager Lead, Azure SQL Database)
このポストは、3 月 24 日に投稿された Elastic Database Transactions are now generally available for Azure SQL Database の翻訳です。
Azure SQL Database で Elastic Database Transactions の一般提供が開始されました。Elastic Database Transactions は、データベース全体の状態の整合性確保が必要な場合に原子性と独立性を実現するための機能です。これらの特性は、たとえばデータベース間で財務トランザクションを処理したり、あるデータベースの在庫と別のデータベースで注文を同時に更新したりする場合に必要になります。
今回の一般提供版では、複数の論理サーバー間の分散トランザクションが新たにサポートされました。SQL Database の Elastic Database Transactions では、サーバーの境界だけでなく、Azure リージョンの境界も越えることができます。
異なるサーバー間 (場合によっては異なる Azure リージョンに存在するサーバー間) でのトランザクションを実装するには、まず Elastic Database Transactions に参加している論理サーバーを通信リレーションシップに追加する必要があります。これにより、分散トランザクションを調整するためのメッセージを論理サーバー間で送受信できます。Elastic Database Transactions に使用する通信リレーションシップの管理は PowerShell コマンドレットから行います。PowerShell コマンドレットでは、1 組のサーバー間の通信リレーションシップの作成、取得、削除が可能です。
Elastic Database Transactions に参加する論理サーバーに通信リレーションシップを追加したら、System.Transactions の TransactionScope クラスなど、使い慣れたプログラミングの抽象化を使用して、アプリケーションの分散トランザクションの境界を制御することができます。Elastic Database Transactions は、.NET 4.6.1 以降の .NET アプリケーションでのみ使用できます。BEGIN DISTRIBUTED TRANSACTION などの T-SQL による分散トランザクションの調整は、SQL Database ではサポートされていません。
サーバー間のトランザクション
Elastic Database Transactions のパブリック プレビューについてお伝えした前回のブログ記事 (英語) では、Azure SQL Database の同一論理サーバーに存在する 2 つのデータベース間のトランザクションの例をご紹介しました。今回は、SQL Database の異なる論理サーバーに存在するデータベース間で同様の分散トランザクションを実行する方法をご紹介します。
サーバー間の通信リンクの確立
まずは、New-AzureRmSqlServerCommunicationLink コマンドレットを使用して 2 つのサーバー間の通信リレーションシップを確立します。このコマンドレットや通信リレーションシップを管理するためのその他のコマンドレットは、PowerShell Gallery から入手できます。PowerShell Gallery から最新のコマンドレットをインストールする方法については、こちらのページを参照してください。
次に示す PowerShell ステートメントは、Azure SQL Database の myserver1 および myserver2 という名前の論理サーバーの間で通信リレーションシップを作成するものです。
-AzureRmSqlServerCommunicationLink `
-LinkName etlaunch `
-PartnerServer myserver02 `
-ServerName myserver01 `
-ResourceGroupName myrg
開発エクスペリエンス
次に示すコード サンプルは、サーバー間のシナリオに対応するように、前回のブログ記事 (英語) のコード サンプルを拡張したものです。コード サンプルの接続文字列は、前の手順で新しい Azure PowerShell コマンドレットを使用して登録した論理サーバー名を参照しています。
SqlConnectionStringBuilder scsbDb1 = new SqlConnectionStringBuilder
{
DataSource = "myserver01.database.windows.net",
InitialCatalog = "db01",
…
};
SqlConnectionStringBuilder scsbDb2 = new SqlConnectionStringBuilder
{
DataSource = "myserver02.database.windows.net",
InitialCatalog = "db02",
…
};
using (var scope = new TransactionScope())
{
using (var conn1 = new SqlConnection(scsbDb1.ConnectionString))
{
conn1.Open();
SqlCommand cmd1 = conn1.CreateCommand();
cmd1.CommandText = string.Format("insert into T1 values(1)");
cmd1.ExecuteNonQuery();
}
using (var conn2 = new SqlConnection(scsbDb2.ConnectionString))
{
conn2.Open();
var cmd2 = conn2.CreateCommand();
cmd2.CommandText = string.Format("insert into T1 values(2)");
cmd2.ExecuteNonQuery();
}
scope.Complete();
}
次のステップ
.NET 4.6.1 をダウンロードして、SQL Database で Elastic Database Transactions をお試しください。SQL Database および .NET 4.6.1 で Elastic Database Transactions を使用する方法の詳細については、Elastic Database Transactions のドキュメントおよび .NET 4.6.1 のリリース発表記事を参照してください。