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

O Multiple Active Result Sets (MARS) é 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 MARS está ativado 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 sessão única de MARS abre uma conexão lógica para MARS para uso e, em seguida, 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 seguintes cadeias de conexão usam o banco de dados AdventureWorks de exemplo incluído com SQL Server.The following connection strings use the sample AdventureWorks database included with SQL Server. As cadeias de conexão fornecidas supõem que o banco de dados esteja instalado em um servidor chamado MSSQL1.The connection strings provided assume that the database is installed on a server named MSSQL1. Modifique a cadeia de conexão conforme o necessário para seu ambiente.Modify the connection string as necessary for your environment.

O recurso MARS é desabilitado por padrão.The MARS feature is disabled by default. Ele pode ser ativado adicionando o par de palavras-chave de "MultipleActiveResultSets=True" à 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 conectar-se a uma instância do SQL Server e como especificar que o MARS deve ser 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";  

Você pode desabilitar MARS adicionando o par de palavras-chave de "MultipleActiveResultSets=False" à 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 o MARS."False" is the only valid value for disabling MARS. A cadeia de conexão a seguir demonstra como desabilitar 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

Geralmente, os aplicativos existentes não devem precisar de nenhuma alteração para usar uma conexão habilitada para MARS.In general, existing applications should not need modification to use a MARS-enabled connection. Entretanto, se você quiser usar os recursos do MARS em seus aplicativos, deverá compreender as seguintes considerações especiais.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 maneira síncrona no servidor.MARS operations execute synchronously on the server. A interpolação das instruções SELECT e BULK INSERT é permitida.Statement interleaving of SELECT and BULK INSERT statements is allowed. No entanto, as instruções da linguagem DML e de DDL (linguagem de definição de dados) são executadas atomicamente.However, data manipulation language (DML) and data definition language (DDL) statements execute atomically. As instruções que tentarem ser executadas enquanto um lote atômico é executado 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 de MARS, um deles contendo uma instrução SELECT e o outro contendo uma instrução de DML, o DML pode iniciar a execução dentro da 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 de DML deve ser executada para ser concluída antes de a instrução SELECT poder continuar.However, the DML statement must run to completion before the SELECT statement can make progress. Se as duas instruções estiverem em execução na mesma transação, as alterações feitas por uma instrução de DML após a declaração SELECT ter começado a execução não serã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 produz a transação enquanto aguarda, ou seja, até que a primeira linha seja gerada.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 significa que nenhum outro lote pode ser executado dentro da mesma conexão enquanto uma instrução WAITFOR estiver aguardando.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 uma sobrecarga adicional.When a connection is opened with MARS enabled, a logical session is created, which adds additional overhead. Para minimizar a sobrecarga e aprimorar o desempenho, o SqlClient armazena em cache a sessão Mars em 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. Este valor não é ajustável pelo usuário.This value is not user adjustable. Se o limite de sessão for alcançado, 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 contidas nela são por conexão; não são compartilhados entre as conexões.The cache and sessions contained in it are per-connection; they are not shared across connections. Quando uma sessão é lançada, é retornada para o pool a menos que o limite superior do pool tenha sido alcançado.When a session is released, it is returned to the pool unless the pool's upper limit has been reached. Se o pool do cache estiver concluído, a sessão será fechada.If the cache pool is full, the session is closed. As sessões do MARS não expiram.MARS sessions do not expire. Elas 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 é pré-carregado.The MARS session cache is not preloaded. Ele é carregado quando o aplicativo exige mais sessões.It is loaded as the application requires more sessions.

Segurança de threadsThread Safety

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

Pool de conexõesConnection Pooling

As 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 MARS habilitado e outra com MARS desabilitado, as duas conexões estarã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, confira Pooling de conexão 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 é, em seguida, copiado em uma sessão lógica do MARS.This environment is then copied into a logical MARS session.

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

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

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

  • Contexto de banco de dados (o 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 nível superiorTop-level temporary tables

Com o MARS, um ambiente padrão de execução está associado a uma conexão.With MARS, a default execution environment is associated to a connection. Cada novo lote que inicia sendo executado em 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 é executado em um determinado lote, todas as alterações feitas ao ambiente são do escopo do 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 estiver concluída, as configurações de execução serã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 emite vários comandos para serem executados em sequência na mesma transação, a semântica é a mesma que as expostas por 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 é criado para remover todos os requisitos para 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 verdadeira de comandos em um servidor, várias conexões deverão ser usadas.If an application needs true parallel execution of commands against a server, multiple connections should be used.

Por exemplo, considere o seguinte cenário.For example, consider the following scenario. Dois objetos de comando são criados, um para processar um conjunto de resultados e outro para atualizar dados; eles compartilham uma conexão comum através do MARS.Two command objects are created, one for processing a result set and another for updating data; they share a common connection via MARS. Nesse cenário, o Transaction.CommitIn this scenario, the Transaction.Commit falha na atualização até que todos os resultados tenham sido lidos no primeiro objeto de comando, produzindo 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: Contexto de transação em uso por outra sessão.Message: Transaction context in use by another session.

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

Esperado: (null)Expected: (null)

Recepção System.Data.SqlClient.SqlExceptionReceived: System.Data.SqlClient.SqlException

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

  1. Inicie a transação após o leitor ter sido criado, de modo que 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 em seguida se torna sua própria transação.Every update then becomes its own transaction.

  2. Confirme todo o trabalho depois que o leitor for fechado.Commit all work after the reader is closed. Isso tem o potencial para um lote significativo de atualizações.This has the potential for a substantial batch of updates.

  3. Não use MARS; em vez disso, use uma conexão separada para cada objeto de comando, da mesma forma que você faria 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 de 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.

Consulte tambémSee also