Habilitando vários conjuntos de resultados ativosEnabling Multiple Active Result Sets

MARS (Conjuntos de resultados ativos múltiplos) é um recurso que funciona com o SQL Server para permitir a execução de vários lotes em uma única conexão.Multiple Active Result Sets (MARS) is a feature that works with SQL Server to allow the execution of multiple batches on a single connection. Quando o MARS está habilitado para uso com o SQL Server, cada objeto de comando usado adiciona uma sessão à conexão.When MARS is enabled for use with SQL Server, each command object used adds a session to the connection.

Observação

Uma única sessão do MARS abre uma conexão lógica para que o MARS utilize, asism como uma conexão lógica para cada comando ativo.A single MARS session opens one logical connection for MARS to use and then one logical connection for each active command.

Habilitando e desabilitando MARS na cadeia de conexãoEnabling and Disabling MARS in the Connection String

Observação

As cadeias de conexão a seguir usam o banco de dados de exemplo AdventureWorks incluído com o SQL Server.The following connection strings use the sample AdventureWorks database included with SQL Server. As cadeias de conexão fornecidas pressupõem que o banco de dados está instalado em um servidor denominado MSSQL1.The connection strings provided assume that the database is installed on a server named MSSQL1. Modifique a cadeia de conexão conforme necessário para o seu ambiente.Modify the connection string as necessary for your environment.

O recurso MARS está desabilitado por padrão.The MARS feature is disabled by default. Ele pode ser habilitado adicionando o par de palavras-chave "MultipleActiveResultSets=True" à sua cadeia de conexão.It can be enabled by adding the "MultipleActiveResultSets=True" keyword pair to your connection string. "True" é o único valor válido para habilitar MARS."True" is the only valid value for enabling MARS. O exemplo a seguir demonstra como se conectar a uma instância do SQL Server e como especificar que o MARS deve estar habilitado.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";  

É possível desabilitar MARS adicionando o par de palavras-chave "MultipleActiveResultSets=False" à sua cadeia de conexão.You can disable MARS by adding the "MultipleActiveResultSets=False" keyword pair to your connection string. "False" é o único valor válido para desabilitar MARS."False" is the only valid value for disabling MARS. A cadeia de conexão a seguir demonstra como desabilitar o 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";  

Considerações especiais ao usar MARSSpecial Considerations When Using MARS

Em geral, os aplicativos existentes não devem precisar de modificação para usar uma conexão habilitada para MARS.In general, existing applications should not need modification to use a MARS-enabled connection. No entanto, se você quiser usar recursos de MARS em seus aplicativos, deverá entender as considerações especiais a seguir.However, if you wish to use MARS features in your applications, you should understand the following special considerations.

Interpolação de instruçãoStatement Interleaving

As operações de MARS são executadas de forma síncrona no servidor.MARS operations execute synchronously on the server. É permitida a intercalação das instruções SELECT e BULK INSERT.Statement interleaving of SELECT and BULK INSERT statements is allowed. No entanto, as instruções em DML (linguagem de manipulação de dados) e DDL (linguagem de definição de dados) são executadas atomicamente.However, data manipulation language (DML) and data definition language (DDL) statements execute atomically. Todas as tentativas de instruções para serem executadas enquanto um lote atômico estiver em execução serão bloqueadas.Any statements attempting to execute while an atomic batch is executing are blocked. A execução paralela no servidor não é um recurso do MARS.Parallel execution at the server is not a MARS feature.

Se dois lotes forem enviados em uma conexão MARS, um deles contendo uma instrução SELECT, o outro contendo uma instrução DML, o DML poderá iniciar a execução na execução da instrução 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. No entanto, a instrução DML deve ser executada até a conclusão para que a instrução SELECT possa progredir.However, the DML statement must run to completion before the SELECT statement can make progress. Se ambas as instruções estiverem em execução em uma mesma transação, todas as alterações feitas por uma instrução DML após a instrução SELECT começar a execução não ficarão visíveis para a operação de leitura.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.

Uma instrução WAITFOR dentro de uma instrução SELECT não produzirá a transação enquanto estiver em espera, ou seja, até que a primeira linha seja produzida.A WAITFOR statement inside a SELECT statement does not yield the transaction while it is waiting, that is, until the first row is produced. Isso implica que nenhum outro lote pode ser executado na mesma conexão enquanto uma instrução WAITFOR está em espera.This implies that no other batches can execute within the same connection while a WAITFOR statement is waiting.

Cache de sessão de MARSMARS Session Cache

Quando uma conexão é aberta com o MARS habilitado, uma sessão lógica é criada, o que adiciona sobrecarga extra.When a connection is opened with MARS enabled, a logical session is created, which adds additional overhead. Para reduzir a sobrecarga e melhorar o desempenho, o SqlClient armazena em cache a sessão de MARS dentro de uma conexão.To minimize overhead and enhance performance, SqlClient caches the MARS session within a connection. O cache contém no máximo 10 sessões de MARS.The cache contains at most 10 MARS sessions. Esse valor não é especificado pelo usuário.This value is not user adjustable. Se o limite de sessão for atingido, uma nova sessão será criada – um erro não será gerado.If the session limit is reached, a new session is created—an error is not generated. O cache e as sessões que ele contém são por conexão e não são compartilhados entre conexões.The cache and sessions contained in it are per-connection; they are not shared across connections. Quando uma sessão é liberada, ela retorna ao pool, a menos que o limite superior do pool tenha sido atingido.When a session is released, it is returned to the pool unless the pool's upper limit has been reached. Se o pool de cache estiver cheio, a sessão será fechada.If the cache pool is full, the session is closed. As sessões de MARS não expiram.MARS sessions do not expire. Somente são limpas quando o objeto de conexão é descartado.They are only cleaned up when the connection object is disposed. O cache de sessão de MARS não fica pré-carregado.The MARS session cache is not preloaded. Ele é carregado quando o aplicativo requer mais sessões.It is loaded as the application requires more sessions.

Acesso thread-safeThread Safety

As operações de MARS não são thread-safe.MARS operations are not thread-safe.

Pool de conexõesConnection Pooling

Conexões habilitadas para MARS são agrupadas como qualquer outra conexão.MARS-enabled connections are pooled like any other connection. Se um aplicativo abrir duas conexões, uma com o MARS habilitado e outra com o MARS desabilitado, as duas conexões ficarão em pools separados.If an application opens two connections, one with MARS enabled and one with MARS disabled, the two connections are in separate pools. Para obter mais informações, consulte Pool de Conexões do SQL Server (ADO.NET).For more information, see SQL Server Connection Pooling (ADO.NET).

Ambiente de execução em lotes do SQL ServerSQL Server Batch Execution Environment

Quando uma conexão é aberta, um ambiente padrão é definido.When a connection is opened, a default environment is defined. Esse ambiente é então copiado para uma sessão MARS lógica.This environment is then copied into a logical MARS session.

O ambiente de execução de lote inclui os seguintes componentes:The batch execution environment includes the following components:

  • Opções Set (por exemplo, ANSI_NULLS, DATE_FORMAT, idioma, TEXTSIZE)Set options (for example, ANSI_NULLS, DATE_FORMAT, LANGUAGE, TEXTSIZE)

  • Contexto de segurança (função de usuário/aplicativo)Security context (user/application role)

  • Contexto de banco de dados (banco de dados atual)Database context (current database)

  • Variáveis de estado de execução (por exemplo, @@ERROR, @@ROWCOUNT, @@FETCH_STATUS @@IDENTITY)Execution state variables (for example, @@ERROR, @@ROWCOUNT, @@FETCH_STATUS @@IDENTITY)

  • Tabelas temporárias de alto nívelTop-level temporary tables

Com o MARS, um ambiente de execução padrão é associado a uma conexão.With MARS, a default execution environment is associated to a connection. Cada lote novo que inicia a execução sob uma determinada conexão recebe uma cópia do ambiente padrão.Every new batch that starts executing under a given connection receives a copy of the default environment. Sempre que o código for executado em um determinado lote, todas as alterações feitas no ambiente terão o escopo definido para o lote específico.Whenever code is executed under a given batch, all changes made to the environment are scoped to the specific batch. Quando a execução termina, as configurações de execução são copiadas no ambiente padrão.Once execution finishes, the execution settings are copied into the default environment. No caso de um único lote que envia vários comandos a serem executados consecutivamente na mesma transação, as semânticas são as mesmas que aquelas descritas pelas conexões que envolvem clientes ou servidores anteriores.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.

Execução paralelaParallel Execution

O MARS não foi desenvolvido para remover todos os requisitos de várias conexões em um aplicativo.MARS is not designed to remove all requirements for multiple connections in an application. Se um aplicativo precisar de execução paralela real de comandos em um servidor, será necessário usar várias conexões.If an application needs true parallel execution of commands against a server, multiple connections should be used.

Por exemplo, considere o cenário a seguir.For example, consider the following scenario. Dois objetos de comando são criados, um para processamento de um conjunto de resultados e outro para a atualização de dados; eles compartilham uma conexão comum via MARS.Two command objects are created, one for processing a result set and another for updating data; they share a common connection via MARS. Neste cenário, a Transaction.CommitIn this scenario, the Transaction.Commit falha na atualização até que todos os resultados tenham sido lidos no primeiro objeto de comando, gerando a seguinte exceção:fails on the update until all the results have been read on the first command object, yielding the following exception:

Mensagem: o contexto da transação está sendo usado por outra sessão.Message: Transaction context in use by another session.

Fonte: .NET SqlClient Provedor de DadosSource: .NET SqlClient Data Provider

Esperado: (nulo)Expected: (null)

Recebido: System.Data.SqlClient.SqlExceptionReceived: System.Data.SqlClient.SqlException

Há três opções para lidar com esse cenário:There are three options for handling this scenario:

  1. Inicie a transação depois que o leitor for criado, para que ele não faça parte da transação.Start the transaction after the reader is created, so that it is not part of the transaction. Cada atualização torna-se sua própria transação.Every update then becomes its own transaction.

  2. Confirme todo o trabalho após o fechamento do leitor.Commit all work after the reader is closed. Isso tem potencial para um lote substancial de atualizações.This has the potential for a substantial batch of updates.

  3. Não usar MARS; em vez disso, use uma conexão separada para cada objeto de comando, como seria feito antes do MARS.Don't use MARS; instead use a separate connection for each command object as you would have before MARS.

Detectando o suporte de MARSDetecting MARS Support

Um aplicativo pode verificar o suporte a MARS lendo o valor SqlConnection.ServerVersion.An application can check for MARS support by reading the SqlConnection.ServerVersion value. O número principal deve ser 9 para o SQL Server 2005 e 10 para o SQL Server 2008.The major number should be 9 for SQL Server 2005 and 10 for SQL Server 2008.

Confira tambémSee also