複数のアクティブな結果セットの有効化Enabling Multiple Active Result Sets

複数のアクティブな結果セット (MARS : Multiple Active Result Set) は、SQL Server で動作する機能であり、複数のバッチを単一の接続で実行することができます。Multiple Active Result Sets (MARS) is a feature that works with SQL Server to allow the execution of multiple batches on a single connection. SQL Server で使用できるように MARS が有効になっているときは、使用中の各コマンド オブジェクトは接続にセッションを追加します。When MARS is enabled for use with SQL Server, each command object used adds a session to the connection.

注意

単一の MARS セッションは、MARS 用に 1 つの論理接続を開いた後、アクティブな各コマンドにつき 1 つの論理接続を開きます。A single MARS session opens one logical connection for MARS to use and then one logical connection for each active command.

接続文字列で MARS を有効または無効にするEnabling and Disabling MARS in the Connection String

注意

次の接続文字列のサンプルを使用してAdventureWorks SQL Server に含まれているデータベース。The following connection strings use the sample AdventureWorks database included with SQL Server. 指定されている接続文字列は、データベースが MSSQL1 という名前のサーバーにインストールされていることを前提としています。The connection strings provided assume that the database is installed on a server named MSSQL1. 必要に応じて、お使いの環境に合わせて接続文字列を変更してください。Modify the connection string as necessary for your environment.

既定では、MARS 機能は無効になっています。The MARS feature is disabled by default. この機能を有効にするには、キーワード ペア "MultipleActiveResultSet=True" を接続文字列に追加します。It can be enabled by adding the "MultipleActiveResultSets=True" keyword pair to your connection string. "True" は、MARS を有効にするための唯一の有効な値です。"True" is the only valid value for enabling MARS. 次の例では、SQL Server のインスタンスに接続し、MARS が有効になるよう指定する方法について説明します。The following example demonstrates how to connect to an instance of SQL Server and how to specify that MARS should be enabled.

Dim connectionString As String = "Data Source=MSSQL1;" & _  
    "Initial Catalog=AdventureWorks;Integrated Security=SSPI;" & _  
    "MultipleActiveResultSets=True"  
string connectionString = "Data Source=MSSQL1;" +   
    "Initial Catalog=AdventureWorks;Integrated Security=SSPI;" +  
    "MultipleActiveResultSets=True";  

MARS を無効にするには、キーワード ペア "MultipleActiveResultSet=False" を接続文字列に追加します。You can disable MARS by adding the "MultipleActiveResultSets=False" keyword pair to your connection string. "False" は、MARS を無効にするための唯一の有効な値です。"False" is the only valid value for disabling MARS. 次の接続文字列では、MARS を無効にしています。The following connection string demonstrates how to disable MARS.

Dim connectionString As String = "Data Source=MSSQL1;" & _  
    "Initial Catalog=AdventureWorks;Integrated Security=SSPI;" & _  
    "MultipleActiveResultSets=False"  
string connectionString = "Data Source=MSSQL1;" +   
    "Initial Catalog=AdventureWorks;Integrated Security=SSPI;" +  
    "MultipleActiveResultSets=False";  

MARS の使用に関する特記事項Special Considerations When Using MARS

一般に、MARS の有効な接続を使用するために、既存のアプリケーションを修正する必要はありません。In general, existing applications should not need modification to use a MARS-enabled connection. ただし、MARS 機能をご自分のアプリケーションで使用する場合、次の特記事項について理解しておく必要があります。However, if you wish to use MARS features in your applications, you should understand the following special considerations.

ステートメント インタリーブStatement Interleaving

MARS 操作は、サーバー上で同期して実行されます。MARS operations execute synchronously on the server. SELECT ステートメントと BULK INSERT ステートメントをインタリーブすることができます。Statement interleaving of SELECT and BULK INSERT statements is allowed. ただし、DML (データ操作言語) と DDL (データ定義言語) のステートメントはアトミック実行されます。However, data manipulation language (DML) and data definition language (DDL) statements execute atomically. バッチのアトミック実行中にステートメントを実行しようとすると、いずれもブロックされます。Any statements attempting to execute while an atomic batch is executing are blocked. サーバーでの並列実行は MARS の機能ではありません。Parallel execution at the server is not a MARS feature.

MARS 接続において、SELECT ステートメントを含むバッチと DML ステートメントを含むバッチの 2 つが送信されると、SELECT ステートメントの実行中に DML の実行が開始されます。If two batches are submitted under a MARS connection, one of them containing a SELECT statement, the other containing a DML statement, the DML can begin execution within execution of the SELECT statement. ただし、DML ステートメントは SELECT ステートメントが進行する前に実行を完了しなければなりません。However, the DML statement must run to completion before the SELECT statement can make progress. 両方のステートメントが同じトランザクションで実行されている場合、SELECT ステートメントの実行を開始した後に行われた DML ステートメントによる変更は、読み取り操作では表示されません。If both statements are running under the same transaction, any changes made by a DML statement after the SELECT statement has started execution are not visible to the read operation.

SELECT ステートメント内の WAITFOR ステートメントは、待機中、つまり最初の行が作成されるまではトランザクションを生成しません。A WAITFOR statement inside a SELECT statement does not yield the transaction while it is waiting, that is, until the first row is produced. これは、WAITFOR ステートメントが待機している間は、同一の接続内では他のいかなるバッチも実行されないことを意味します。This implies that no other batches can execute within the same connection while a WAITFOR statement is waiting.

MARS セッションのキャッシュMARS Session Cache

MARS を有効にして接続が開かれている場合、論理セッションが作成されます。このセッションによってオーバーヘッドが増加します。When a connection is opened with MARS enabled, a logical session is created, which adds additional overhead. オーバーヘッドを最小限に抑え、パフォーマンスを向上させるSqlClient接続内で、MARS セッションをキャッシュします。To minimize overhead and enhance performance, SqlClient caches the MARS session within a connection. キャッシュには、最大 10 個の MARS セッションが含まれます。The cache contains at most 10 MARS sessions. ユーザーがこの値を変更することはできません。This value is not user adjustable. セッションが限度に達すると新しいセッションが作成され、エラーは生成されません。If the session limit is reached, a new session is created—an error is not generated. キャッシュとそのキャッシュに含まれるセッションは、接続ごとに作成されます。接続をまたいで共有されることはありません。The cache and sessions contained in it are per-connection; they are not shared across connections. セッションが解放されると、プールの上限に達している場合を除き、セッションはプールに返されます。When a session is released, it is returned to the pool unless the pool's upper limit has been reached. キャッシュ プールがいっぱいになっている場合、セッションは閉じられます。If the cache pool is full, the session is closed. MARS セッションの有効期限は終了しません。MARS sessions do not expire. クリーンアップされるのは、接続オブジェクトが破棄されるときだけです。They are only cleaned up when the connection object is disposed. MARS セッションのキャッシュはプリロードされません。The MARS session cache is not preloaded. アプリケーションがさらに多くのセッションを要求したときに読み込まれます。It is loaded as the application requires more sessions.

スレッド セーフThread Safety

MARS 操作は、スレッド セーフではありません。MARS operations are not thread-safe.

接続プールConnection Pooling

MARS の有効な接続は、その他の接続と同じようにプールされます。MARS-enabled connections are pooled like any other connection. アプリケーションが 2 つの接続を開き、その一方は MARS が有効で他方は MARS が無効になっている場合、それら 2 つの接続は別々のプールに入れられます。If an application opens two connections, one with MARS enabled and one with MARS disabled, the two connections are in separate pools. 詳しくは、「SQL Server の接続プール (ADO.NET)」をご覧ください。For more information, see SQL Server Connection Pooling (ADO.NET).

SQL Server のバッチ実行環境SQL Server Batch Execution Environment

接続を開くとき、既定の環境が定義されます。When a connection is opened, a default environment is defined. この環境は、MARS の論理セッションにコピーされます。This environment is then copied into a logical MARS session.

バッチ実行環境には、次のコンポーネントが含まれます。The batch execution environment includes the following components:

  • SET オプション (ANSI_NULLS、DATE_FORMAT、LANGUAGE、TEXTSIZE など)Set options (for example, ANSI_NULLS, DATE_FORMAT, LANGUAGE, TEXTSIZE)

  • セキュリティ コンテキスト (ユーザーまたはアプリケーションのロール)Security context (user/application role)

  • データベース コンテキスト (現在のデータベース)Database context (current database)

  • 実行状態変数 (たとえば、@@ERROR、@@ROWCOUNT、@@FETCH_STATUS @@IDENTITY)Execution state variables (for example, @@ERROR, @@ROWCOUNT, @@FETCH_STATUS @@IDENTITY)

  • 最上位の一時テーブルTop-level temporary tables

MARS を使用すると、既定の実行環境が接続に関連付けられます。With MARS, a default execution environment is associated to a connection. 所定の接続で実行を開始する新しいバッチは、いずれも既定の環境のコピーを受け取ります。Every new batch that starts executing under a given connection receives a copy of the default environment. コードが所定のバッチで実行されるときは、その環境に対して行われるすべての変更は、常に特定のバッチにスコープ設定されます。Whenever code is executed under a given batch, all changes made to the environment are scoped to the specific batch. 実行が完了すると、実行の設定は既定の環境にコピーされます。Once execution finishes, the execution settings are copied into the default environment. 単一のバッチが複数のコマンドを発行し、それらが同じトランザクションで連続して実行される場合、そのセマンティクスは、以前のクライアントやサーバーを含む接続で公開されているときのセマンティクスと同じです。In the case of a single batch issuing several commands to be executed sequentially under the same transaction, semantics are the same as those exposed by connections involving earlier clients or servers.

並列実行Parallel Execution

MARS は、アプリケーション内で複数の接続に対するすべての要件を削除するようには設計されていません。MARS is not designed to remove all requirements for multiple connections in an application. アプリケーションがサーバーに対するコマンドの完全な並列実行を必要とする場合、複数の接続を使用する必要があります。If an application needs true parallel execution of commands against a server, multiple connections should be used.

たとえば、次のようなシナリオがあるとします。For example, consider the following scenario. 2 つのコマンド オブジェクトが作成され、一方は結果セットを処理し、もう一方はデータを更新するとします。それらは MARS を介して共通の接続を共有します。Two command objects are created, one for processing a result set and another for updating data; they share a common connection via MARS. このシナリオで、Transactionします。CommitIn this scenario, the Transaction.Commit 次の例外を生成する最初のコマンド オブジェクトのすべての結果を読み取られるまでの更新で失敗します。fails on the update until all the results have been read on the first command object, yielding the following exception:

メッセージ:別のセッションで使用中のトランザクション コンテキスト。Message: Transaction context in use by another session.

ソース: .NET SqlClient データ プロバイダーSource: .NET SqlClient Data Provider

期待される出力: (null)Expected: (null)

受信。System.Data.SqlClient.SqlExceptionReceived: System.Data.SqlClient.SqlException

このシナリオに対応するには、次の 3 つの方法があります。There are three options for handling this scenario:

  1. リーダーが作成されてからトランザクションを開始し、リーダーがトランザクションの一部にならないようにします。Start the transaction after the reader is created, so that it is not part of the transaction. すべての更新は、それ自身のトランザクションになります。Every update then becomes its own transaction.

  2. リーダーが閉じてからすべての操作をコミットします。Commit all work after the reader is closed. この場合、後続の更新バッチが実行される可能性があります。This has the potential for a substantial batch of updates.

  3. MARS を使用せず、代わりに MARS が導入される以前に行っていたように、コマンド オブジェクトごとに別々の接続を使用します。Don't use MARS; instead use a separate connection for each command object as you would have before MARS.

MARS サポートの検出Detecting MARS Support

アプリケーションは、SqlConnection.ServerVersion の値を読み取って MARS サポートを確認することができます。An application can check for MARS support by reading the SqlConnection.ServerVersion value. SQL Server 2005 のメジャー番号は 9、SQL Server 2008 のメジャー番号は 10 です。The major number should be 9 for SQL Server 2005 and 10 for SQL Server 2008.

関連項目See also