分散クエリと分散トランザクション
SQL Server データベース エンジンを使用すると、リンク サーバーと呼ばれる OLE DB データ ソースへのリンクを作成できます。OLE DB データ ソースへのリンクを作成すると、次の操作ができます。
Transact-SQL ステートメントを使用して OLE DB データ ソースの行セットをテーブルとして参照します。
- Transact-SQL ステートメントを使用して OLE DB データ ソースにコマンドを渡し、その結果生成される行セットをテーブルとして受け入れます。
分散クエリでは、複数のリンク サーバーを参照し、各リンク サーバーに対して更新操作または読み取り操作を実行できます。1 つの分散クエリで、あるリンク サーバーには読み取り操作を実行し、他のリンク サーバーには更新操作を実行できます。一般的に、トランザクションで複数のリンク サーバーのデータが更新される可能性があるときは、対応する OLE DB プロバイダからの分散トランザクション サポートをデータベース エンジンが必要とします。したがって、リンク サーバーに対してサポートされるクエリの種類は、OLE DB プロバイダでのトランザクションのサポート レベルによって決まります。OLE DB では、トランザクション管理用に任意に選択できる 2 つのインターフェイスを定義しています。
ITransactionLocal では、OLE DB データ ソース内のローカル トランザクションをサポートします。
ITransactionJoin を使用すると、他のリソース マネージャを含む分散トランザクションをプロバイダで結合できます。
ITransactionJoin をサポートするプロバイダでは ITransactionLocal もサポートします。
接続が自動コミット モードのときに分散クエリを実行する場合は、次の規則が適用されます。
ITransactionLocal をサポートしないプロバイダに対しては、読み取り操作だけを行うことができます。
ITransactionLocal をサポートするプロバイダに対しては、すべての更新操作を行うことができます。
データベース エンジンの制御インスタンスにより、更新操作に参加するリンク サーバーごとに ITransactionLocal が自動的に呼び出され、ローカル トランザクションが開始されます。リンク サーバーは、ステートメントが成功したとき、またはステートメントが失敗してリンク サーバーをロールバックするときにコミットされます。
分散パーティション ビューに対して分散クエリを実行する場合、あるいは明示的なトランザクションまたは暗黙のトランザクションのいずれかの接続で分散クエリを実行する場合は、次の規則が適用されます。
ITransactionJoin をサポートしないプロバイダに対しては、読み取り操作だけを行うことができます。どのトランザクションもサポートしないか、ITransactionLocal だけをサポートするプロバイダは更新操作に参加できません。
SET XACT_ABORT が ON の場合、ITransactionJoin をサポートするすべてのプロバイダに対してすべての更新操作を行うことができます。データベース エンジンの制御インスタンスにより、更新操作に参加するリンク サーバーごとに ITransactionJoin が自動的に呼び出され、リンク サーバーが分散トランザクションに含められます。制御サーバーでトランザクションをコミットするかロールバックすることが指定されると、Microsoft 分散トランザクション コーディネータ (MS DTC) により、リンク サーバーがコミットまたはロールバックされます。
SET XACT_ABORT が OFF の場合、リンク サーバーで更新操作を実行するには、入れ子になったトランザクションもリンク サーバーがサポートしている必要があります。入れ子になったトランザクションがサポートされるのは、セッションに既存のトランザクションがあるときにプロバイダが ITransactionLocal::StartTransaction の呼び出しをサポートする場合です。これにより、SQL Server では、トランザクション全体をロールバックせずに分散クエリ内の特定のステートメントだけをロールバックできます。
上記の規則は、入れ子になったトランザクションをサポートしないプロバイダに対する制限事項として、分散トランザクションでの更新操作は、XACT_ABORT が ON の場合のみ行えることを示しています。