Microsoft® SQL Server™ では、リンク サーバーと呼ばれる OLE DB データ ソースへのリンクを作成できます。 OLE DB データ ソースにリンクすると、次のことが可能になります。
Transact-SQL ステートメント内のテーブルとして OLE DB データ ソースから行セットを参照します。
コマンドを OLE DB データ ソースに渡し、結果の行セットをテーブルとして Transact-SQL ステートメントに含めます。
各分散クエリは複数のリンク サーバーを参照でき、各リンク サーバーは更新または読み取り操作を個別に実行できます。単一の分散クエリは、一部のリンク サーバーで読み取り操作を実行し、他のリンク サーバーで更新操作を実行できます。通常、トランザクションが複数のリンク サーバーのデータを更新する可能性がある場合、Microsoft SQL Server では、対応する OLE DB プロバイダーが分散トランザクションをサポートしていることが必要になります。したがって、リンク サーバーでサポートされるクエリの種類は、OLE DB プロバイダーのトランザクションのサポート レベルによって異なります。 OLE DB は、トランザクション管理用に 2 つのオプションのインターフェイスを定義します。
ITransactionLocal は、OLE DB データ ソースのローカル トランザクションをサポートします。
ITransactionJoin を使用すると、プロバイダーは他のリソース マネージャーが関与する分散トランザクションに参加できます。
ITransactionJoin をサポートするすべてのプロバイダーは、ITransactionLocal もサポートします。
接続が自動コミット モードのときに分散クエリを実行する場合、次のルールが適用されます:
ItransactionLocal をサポートしていないプロバイダーの場合は、読み取り操作のみが許可されます。
ITransactionLocal をサポートするプロバイダーの場合、すべての更新操作が許可されます。マスター SQL Server は、更新操作に参加している各リンク サーバーで ITransactionLocal を自動的に呼び出してローカル トランザクションを開始し、ステートメントの実行が成功した場合はコミットし、ステートメントの実行が失敗した場合はロールバックします。
分散クエリが分散パーティション ビューに対して実行される場合、または結合が明示的または暗黙的なトランザクションである場合、次のルールが適用されます:
ITransactionJoin をサポートしないプロバイダーには読み取り操作のみが許可されます。トランザクションをサポートしないか、ITransactionLocal のみをサポートするプロバイダーは、更新操作に参加できません。
SET XACT_ABORT が ON に設定されている場合、ITransactionJoin をサポートするプロバイダーに対してすべての更新操作が許可されます。マスター SQL Server は、更新操作に参加している各リンク サーバー上で ITransactionJoin を自動的に呼び出し、サーバーを分散トランザクションに参加させます。その後、マスター サーバーがトランザクションをコミットまたはロールバックすることを示すと、MS DTC はコミットまたはロールバックを行います。
SET XACT_ABORT が OFF に設定されている場合、リンク サーバーで更新操作を実行するには、ネストされたトランザクションもサポートする必要があります。セッションに既存のトランザクションがあるときにプロバイダーが ITransactionLocal::StartTransaction の呼び出しをサポートしている場合、ネストされたトランザクションがサポートされます。これにより、SQL Server はトランザクション全体をロールバックするのではなく、分散クエリ内の個々のステートメントをロールバックできるようになります。
上記のルールは、ネストされたトランザクションがプロバイダーの次の制限によってサポートされていないことを意味します: XACT_ABORT オプションが ON に設定されている場合、分散トランザクションでのみ更新操作が許可されます。