Поделиться через


Включение режима MARS

Обновлен: November 2007

Режим MARS — это новая функция, которая в SQL Server 2005 используется для выполнения нескольких пакетов по одному соединению. Чтобы получить доступ к нескольким результирующим наборам в более ранних версиях SQL Server при помощи объектов SqlDataReader, необходимо воспользоваться отдельным объектом SqlConnection для каждого объекта SqlCommand. Однако когда для работы с SQL Server 2005 включен режим MARS, каждый используемый объект команды добавляет сеанс к соединению.

h32h3abf.alert_note(ru-ru,VS.90).gifПримечание.

Один сеанс режима MARS открывает одно логическое соединение для использования самим режимом MARS, а затем — по одному логическому соединению для каждой активной команды.

Включение и отключение режима MARS в строке соединения

h32h3abf.alert_note(ru-ru,VS.90).gifПримечание.

Следующие строки соединения используют образец базы данных AdventureWorks, поставляемый с SQL Server 2005. Предполагается, что приведенные здесь строки соединения используются для подключения к базе данных на сервере MSSQL1. Измените строку соединения при необходимости в соответствии с вашей средой.

По умолчанию режим MARS отключен. Включить его можно, добавив в строку соединения ключевое слово «MultipleActiveResultSets=True». «True» — это единственное допустимое значение для включения режима MARS. В следующем примере демонстрируется, как подключиться к экземпляру SQL Server, а также как указать, что режим MARS должен быть включен.

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». «False» — это единственное допустимое значение для отключения режима MARS. Следующая строка соединения показывает, как отключать режим 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

В общем случае необходимости изменять существующие приложения для использования соединений с режимом MARS быть не должно. Однако если требуется использовать функцию режима MARS в приложениях, следует ознакомиться со следующими рассуждениями и понять их.

Чередование инструкций

На сервере операции режима MARS выполняются синхронно. Разрешается чередование инструкций SELECT и BULK INSERT. Однако инструкции на языке DML и языке DDL выполняются атомарным образом. Попытка выполнения любых инструкций во время выполнения атомарного пакета блокируется. Параллельное выполнение на сервере не является функцией режима MARS.

Если в рамках соединения режима MARS подаются два пакета (один с инструкцией SELECT, другой с инструкцией DML), выполнение инструкции DML может начаться во время выполнения инструкции SELECT. Однако выполнение инструкции SELECT может быть продолжено только после полного выполнения инструкции DML. Если обе инструкции выполняются в рамках одной транзакции, любые изменения, внесенные инструкцией DML после начала выполнения инструкции SELECT, являются невидимыми для операции чтения.

Инструкция WAITFOR внутри инструкции SELECT не выдает транзакцию во время ожидания, то есть пока не будет сформирована первая строка. А это означает, что пока инструкция WAITFOR ждет, другие пакеты не могут выполняться в рамках одного соединения.

Кэш сеанса режима MARS

При открытии соединения с включенным режимом MARS создается логический сеанс, что требует дополнительных затрат. Чтобы свести к минимуму затраты и повысить производительность, SqlClient кэширует сеанс режима MARS в рамках соединения. Кэш может содержать максимум 10 сеансов режима MARS. Это значение не может быть изменено пользователем. При достижении лимита сеансов создается новый сеанс — ошибка не формируется. Сам кэш и содержащиеся в нем сеансы принадлежат одному соединению, они не могут использоваться в нескольких соединениях. Когда сеанс освобождается, он возвращается в пул, если только не был достигнут верхний предел пула. Если пул кэша заполнен, то сеанс закрывается. Сеансы режима MARS не имеют срока действия. Они очищаются только при удалении объекта соединения. Кэш сеансов режима MARS предварительно не загружается. Он загружается, когда приложению требуется больше сеансов.

Безопасность потока

Операции режима MARS не обеспечивают безопасность потока.

Организация пулов соединений

Как и любые другие соединения, соединения, для которых включен режим MARS, организуются в пулы. Если приложение открывает два соединения (одно с включенным режимом MARS и другое, для которого режим MARS отключен), два эти соединения помещаются в отдельные пулы. Дополнительные сведения см. в разделе Организация пулов соединений SQL Server (ADO.NET).

Среда выполнения пакетов SQL Server

При открытии соединения определяется среда по умолчанию. Затем эта среда копируется в логический сеанс режима MARS.

Среда пакетного выполнения состоит из следующих компонентов:

  • Заданных параметров (например, ANSI_NULLS, DATE_FORMAT, LANGUAGE, TEXTSIZE)

  • Контекста безопасности (роль пользователя-приложения)

  • Контекста базы данных (текущая база данных)

  • Переменных состояния выполнения (например, @@ERROR, @@ROWCOUNT, @@FETCH_STATUS @@IDENTITY)

  • Временных таблиц верхнего уровня

В SQL Server 2000 и более ранних версиях все пакеты, выполняемые в рамках одного соединения, использовали одну пакетную среду. Изменения, произведенные пакетом в среде, были видны для всех последующих пакетов.

При работе в режиме MARS среда выполнения по умолчанию ассоциируется с соединением. Каждый новый пакет, начинающий выполнение в рамках данного соединения, получает копию среды по умолчанию. Всякий раз при выполнении кода все изменения в среде выполнения применяются к данному конкретному пакету. Как только выполнение завершается, настройки выполнения копируются в среду по умолчанию. Если один пакет выдает несколько команд для последовательного выполнения в рамках одной транзакции, семантика такая же, как и при прошлых соединениях клиентов или серверов.

Параллельное выполнение

Режим MARS не предназначен для использования во всех ситуациях, когда приложению требуется несколько соединений. Если приложению требуется настоящее параллельное выполнение команд для сервера, следует использовать несколько соединений.

Например, рассмотрим следующую ситуацию. Создаются два объекта команд, один для обработки результирующего набора, а другой для обновления данных. Они используют одно соединение с режимом MARS. В этой ситуации метод Transaction.Commit не сможет выполнить обновление, пока не будут прочитаны все результаты для первого объекта команды, при этом выдается следующее исключение:

Сообщение: контекст транзакции используется другим сеансом

Есть три способа обработки этой ситуации.

  1. Запустить транзакцию после создания модуля чтения с тем, чтобы он не был частью транзакции. После этого любое обновление будет становиться собственной транзакцией.

  2. Зафиксировать всю работу после закрытия модуля чтения. Это создает потенциал для последующего пакета обновлений.

  3. Не использовать режим MARS, вместо этого использовать отдельное соединение для каждого объекта команды, что было стандартным решением до появления режима MARS.

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

Приложение может проверить, поддерживается ли режим MARS, считав значение SqlConnection.ServerVersion. Для SQL Server 2005 основным номером должно быть 9.

См. также

Другие ресурсы

Режим MARS