Hizkuntza

Habilitar varios conjuntos de resultados activos

Los conjuntos de resultados activos múltiples (MARS) son una característica que funciona con SQL Server y que permite la ejecución de varios lotes en una sola conexión. Cuando MARS está habilitado para su uso con SQL Server, cada objeto de comando usado agrega una sesión a la conexión.

Nota

Una sola sesión de MARS abre una conexión lógica para que MARS la use y, a continuación, una conexión lógica para cada comando activo.

Habilitación y deshabilitación de MARS en la cadena de conexión

Nota

Las siguientes cadenas de conexión usan la base de datos de ejemplo AdventureWorks incluida con SQL Server. Las cadenas de conexión proporcionadas suponen que la base de datos está instalada en un servidor llamado MSSQL1. Modifique la cadena de conexión según sea necesario para el entorno.

La característica MARS está deshabilitada de forma predeterminada. Se puede habilitar agregando el par de palabras clave "MultipleActiveResultSets=True" a la cadena de conexión. "True" es el único valor válido para habilitar MARS. En el ejemplo siguiente se muestra cómo conectarse a una instancia de SQL Server y cómo especificar que se debe habilitar MARS.

Dim connectionString As String = "..." & _
    "MultipleActiveResultSets=True"
string connectionString = "..." +
    "MultipleActiveResultSets=True";

Puede deshabilitar MARS agregando el par de palabras clave "MultipleActiveResultSets=False" a la cadena de conexión. "False" es el único valor válido para deshabilitar MARS.

Consideraciones especiales al utilizar MARS

En general, no es necesario modificar las aplicaciones existentes para utilizar una conexión habilitada para MARS. Sin embargo, si desea usar las características de MARS en sus aplicaciones, debe comprender las siguientes consideraciones especiales.

Entrelazado de instrucciones

Las operaciones de MARS se ejecutan sincrónicamente en el servidor. Se permite la intercalación de las instrucciones SELECT y BULK INSERT. Sin embargo, las instrucciones del lenguaje de manipulación de datos (DML) y del lenguaje de definición de datos (DDL) se ejecutan de forma atómica. Las instrucciones que intentan ejecutarse mientras un lote atómico se está ejecutando están bloqueadas. La ejecución en paralelo en el servidor no es una característica de MARS.

Si se envían dos lotes bajo una conexión MARS, uno de ellos con una instrucción SELECT y el otro con una instrucción DML, la instrucción DML puede comenzar a ejecutarse durante la ejecución de la instrucción SELECT. Sin embargo, la instrucción DML debe ejecutarse hasta completarse antes de que la SELECT instrucción pueda avanzar. Si ambas instrucciones se ejecutan en la misma transacción, los cambios realizados por una instrucción DML después de que la instrucción SELECT haya iniciado su ejecución no son visibles para la operación de lectura.

Una WAITFOR instrucción dentro de una SELECT instrucción no cede la transacción mientras está esperando, es decir, hasta que se genere la primera fila. Esto implica que ningún otro lote se puede ejecutar dentro de la misma conexión mientras una WAITFOR instrucción está esperando.

Caché de sesión MARS

Cuando se abre una conexión con MARS habilitado, el proveedor crea una sesión lógica, que agrega sobrecarga. Para reducir esa sobrecarga, SqlClient almacena en caché hasta 10 sesiones de MARS por conexión. El límite no es ajustable por el usuario. Si se alcanza el límite, el proveedor crea una nueva sesión sin un error. La memoria caché y sus sesiones no se comparten entre conexiones. Después de su uso, una sesión vuelve a la memoria caché a menos que la memoria caché esté llena, en cuyo caso el proveedor la cierra. Las sesiones almacenadas en caché no expiran; el proveedor las limpia cuando cierra la conexión. El proveedor rellena la memoria caché a medida que la aplicación necesita crear sesiones.

Seguridad de hilos

Las operaciones MARS no ofrecen seguridad en subprocesos.

Agrupar conexiones

Las conexiones habilitadas para MARS se agrupan como cualquier otra conexión. Si una aplicación abre dos conexiones, una con MARS habilitado y otra con MARS deshabilitado, las dos conexiones se ubican en grupos independientes. Para obtener más información, vea Agrupación de conexiones de SQL Server (ADO.NET).

Entorno de ejecución por lotes de SQL Server

Cuando se abre una conexión, se define un entorno predeterminado. Luego, este entorno se copia en una lógica sesión de MARS.

El entorno de ejecución de lotes incluye los siguientes componentes:

  • Establecer opciones (por ejemplo, ANSI_NULLS, DATE_FORMAT, LANGUAGE, TEXTSIZE)

  • Contexto de seguridad (rol de usuario/aplicación)

  • Contexto de base de datos (base de datos actual)

  • Variables de estado de ejecución (por ejemplo, @@ERROR, @@ROWCOUNT, @@FETCH_STATUS@@IDENTITY)

  • Tablas temporales de nivel superior

Con MARS, un entorno de ejecución predeterminado está asociado a una conexión. Cada nuevo lote que empieza a ejecutarse en una conexión determinada recibe una copia del entorno predeterminado. Siempre que el código se ejecuta en un lote determinado, todos los cambios realizados en el entorno se limitan al lote específico. Cuando finaliza la ejecución, su configuración se copia en el entorno predeterminado. En el caso de un lote único que emite varios comandos para ser ejecutados secuencialmente en la misma transacción, la semántica es la misma que las expuestas por conexiones que involucren clientes o servidores anteriores.

Ejecución paralela

MARS no está diseñado para quitar todos los requisitos de varias conexiones en una aplicación. Si una aplicación necesita la verdadera ejecución en paralelo de comandos en un servidor, se deben usar varias conexiones.

Por ejemplo, tenga en cuenta el siguiente caso. Se crean dos objetos de comando, uno para procesar un conjunto de resultados y otro para actualizar los datos; comparten una conexión común a través de MARS. En este escenario, el Transaction. Commit no puede realizar la actualización hasta que todos los resultados se hayan leído en el primer objeto de comando, lo que produce la siguiente excepción:

Mensaje: Contexto de transacción en uso por otra sesión.

Origen: .NET SqlClient Proveedor de datos

Se esperaba: (null)

Se recibió: Microsoft.Data.SqlClient.SqlException

Hay tres opciones para ocuparse de este escenario:

  1. Inicie la transacción una vez creado el lector, de modo que no forme parte de la transacción. Cada actualización se convierte entonces en su propia transacción.

  2. Confirme todo el trabajo después de cerrar el dispositivo de lectura. Esto tiene el potencial para un lote sustancial de actualizaciones.

  3. No use MARS; en su lugar, use una conexión independiente para cada objeto de comando como lo haría antes de MARS.

Detección de compatibilidad con MARS

Una aplicación puede comprobar la compatibilidad con MARS leyendo el valor de SqlConnection.ServerVersion. El número mayor debe ser 9 en SQL Server 2005 y 10 en SQL Server 2008.

Consulte también