Включение нескольких активных результирующих наборовEnabling Multiple Active Result Sets

Режим MARS - это новая возможность, которая в 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, а затем - по одному логическому соединению для каждой активной команды.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. Включить его можно, добавив в строку соединения ключевое слово «MultipleActiveResultSets=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 можно, добавив в строку соединения ключевое слово «MultipleActiveResultSets=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";  

Особые рассуждения об использовании режима MARSSpecial 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), выполнение инструкции DML может начаться во время выполнения инструкции SELECT.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. Однако выполнение инструкции SELECT может быть продолжено только после полного выполнения инструкции DML.However, the DML statement must run to completion before the SELECT statement can make progress. Если обе инструкции выполняются в рамках одной транзакции, любые изменения, внесенные инструкцией DML после начала выполнения инструкции SELECT, являются невидимыми для операции чтения.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.

Инструкция WAITFOR внутри инструкции SELECT не выдает транзакцию во время ожидания, то есть пока не будет сформирована первая строка.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.

Кэш сеанса режима MARSMARS 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. Если приложение открывает два соединения (одно с включенным режимом MARS и другое, для которого режим MARS отключен), два эти соединения помещаются в отдельные пулы.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 ServerSQL 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:

  • Заданных параметров (например, 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. Создаются два объекта команд, один для обработки результирующего набора, а другой для обновления данных. Они используют одно соединение с режимом 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 SqlClientSource: .NET SqlClient Data Provider

Ожидается: (значение NULL).Expected: (null)

Приниматься System. Data. SqlClient. SqlExceptionReceived: System.Data.SqlClient.SqlException

Есть три способа обработки этой ситуации.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.

Обнаружение поддержки режима MARSDetecting MARS Support

Приложение может проверить, поддерживается ли режим MARS, считав значение SqlConnection.ServerVersion.An application can check for MARS support by reading the SqlConnection.ServerVersion value. Основным номером должно быть 9 для SQL Server 2005 и 10 для SQL Server 2008.The major number should be 9 for SQL Server 2005 and 10 for SQL Server 2008.

См. такжеSee also