Elegir niveles de aislamiento basado en el control de versión de filas

Los niveles de aislamiento basados en el control de versión de filas mejoran la simultaneidad de lectura porque eliminan los bloqueos de las operaciones de lectura. Microsoft SQL Server incluye dos niveles de aislamiento de transacciones que utilizan el control de versión de filas:

  • Una nueva implementación del aislamiento de lectura confirmada que utiliza el control de versión de filas cuando la opción de base de datos READ_COMMITTED_SNAPSHOT está establecida en ON.

  • Un nuevo nivel de aislamiento, instantánea, que se habilita cuando la opción de base de datos ALLOW_SNAPSHOT_ISOLATION está establecida en ON.

Para la mayoría de aplicaciones, el aislamiento de lectura confirmada que utiliza el control de versión de filas es más recomendable que el aislamiento de instantáneas por los siguientes motivos:

  • Consume menos espacio de tempdb que el aislamiento de instantáneas.

  • A diferencia del aislamiento de instantáneas, funciona con transacciones distribuidas.

  • Funciona con la mayoría de aplicaciones existentes sin necesidad de cambios. Las aplicaciones escritas mediante el nivel de aislamiento predeterminado, lectura confirmada, pueden optimizarse dinámicamente. El comportamiento de la lectura confirmada, independientemente de si utiliza el control de versión de filas o no, está determinado por la configuración de las opciones de la base de datos, que puede cambiarse sin afectar al rendimiento de la aplicación.

    Nota

    Para las aplicaciones diseñadas para depender del comportamiento de bloqueo del aislamiento de lectura confirmada, puede que los desarrolladores deseen modificar la aplicación para que funcione en los dos modos de aislamiento de lectura confirmada. De lo contrario, es muy importante tener en cuenta que la opción de base de datos READ_COMMITTED_SNAPSHOT permanece en OFF.

  • El aislamiento de instantáneas es vulnerable a conflictos de actualizaciones que no son aplicables al aislamiento de lectura confirmada que utiliza el control de versión de filas. Cuando una transacción que se ejecuta en el aislamiento de instantáneas lee los datos que posteriormente modifica otra transacción, cualquier actualización por parte de la transacción de instantáneas a los mismos datos provocará un conflicto de actualizaciones y la transacción finaliza y se revierte. Esto no constituye un problema en el aislamiento de lectura confirmada que utiliza el control de versión de filas.

Cuándo usar el aislamiento de lectura confirmada que utiliza control de versión de filas

El aislamiento de lectura confirmada que utiliza control de versión de filas proporciona coherencia de lectura para las instrucciones. A medida que se ejecuta cada instrucción dentro de la transacción, se toma una nueva instantánea que se mantiene coherente para cada instrucción hasta que finaliza la ejecución de la instrucción. Habilite el aislamiento de lectura confirmada que utiliza control de versión de filas si:

  • El bloqueo de lectura/escritura se produce hasta tal punto que los beneficios de la simultaneidad son más importantes que el costo de crear y administrar las versiones de fila.

  • Una aplicación precisa de una exactitud absoluta para las agregaciones o consultas de ejecución prolongada en las que los valores de los datos deben ser coherentes con el momento en que se inicia una consulta.

Cuándo usar el aislamiento de instantáneas

El aislamiento de instantáneas proporciona coherencia de lectura en las transacciones. Una instantánea de datos se toma cuando se inicia la transacción de la instantánea y se mantiene coherente durante toda la transacción. Utilice el aislamiento de instantáneas si:

  • Desea obtener un control optimista de la simultaneidad.

  • Hay pocas probabilidades de que una transacción se revierta debido a un conflicto de actualizaciones.

  • Una aplicación necesita generar informes basados en consultas de ejecución prolongada formadas por varias instrucciones que deben ser coherentes con un momento dado. El aislamiento de instantáneas ofrece la ventaja de realizar lecturas repetidas (vea Efectos de la simultaneidad) sin utilizar bloqueos compartidos. Una instantánea de base de datos puede ofrecer una funcionalidad similar pero debe implementarse manualmente. El aislamiento de instantáneas proporciona automáticamente la información más reciente en la base de datos para cada transacción de aislamiento de instantáneas.

Ventajas de los niveles de aislamiento basados en el control de versión de filas

Los niveles de aislamiento que utilizan el control de versión de filas proporcionan las siguientes ventajas:

  • Las operaciones de lectura recuperan una instantánea coherente de la base de datos.

  • Las instrucciones SELECT no bloquean los datos durante una operación de lectura (las lecturas no bloquean las escrituras, y viceversa).

  • Las instrucciones SELECT pueden obtener acceso al último valor confirmado de la fila mientras otras transacciones actualizan la fila sin bloquearse.

  • El número de interbloqueos se reduce.

  • El número de bloqueos que una transacción necesita se reduce, lo que reduce el costo del sistema inherente a la administración de bloqueos.

  • Se producen menos extensiones de bloqueo.

Costos de los niveles de aislamiento basados en el control de versión de filas

Para decidir si se utiliza el aislamiento basado en el control de versión de filas es preciso sopesar las ventajas de simultaneidad que supone la reducción de los bloqueos contra el mayor uso de recursos para mantener y leer las versiones de las filas. Tenga en cuenta los siguientes costos asociados a la habilitación del control de versión de filas para los niveles de aislamiento de instantáneas y de lecturas confirmadas:

  • El rendimiento de lectura puede verse afectado cuando las versiones que necesitan las consultas quedan obsoletas y deben explorarse cadenas de versiones largas.

  • El control de versión de filas aumenta el uso de los recursos durante la modificación de los datos a medida que las versiones de filas se mantienen en tempdb.

  • Cuando la opción de base de datos READ_COMMITTED_SNAPSHOT o ALLOW_SNAPSHOT_ISOLATION está establecida en ON, las transacciones de actualización y eliminación de una base de datos determinada deben mantener las versiones de filas incluso cuando ninguna transacción utiliza un nivel de aislamiento basado en el control de versión de filas. La creación de una instantánea de datos coherente que utiliza las versiones de fila implica el uso de recursos del sistema (CPU y memoria) y genera potencialmente más actividad de E/S. Puesto que las versiones de los registros se almacenan en tempdb, el rendimiento es mejor y el número de E/S emitidas es menor cuando se pueden almacenar más páginas tempdb en la memoria para el control de versiones de filas.

    Nota

    La inserción de la fila no suele generar una versión de fila. Sin embargo, en determinadas condiciones, el comando INSERT genera una versión de fila. Por ejemplo, si inserta una fila en una tabla con un índice único cuando no se ha truncado una versión de fila previamente eliminada (registro fantasma), el comando INSERT genera una versión de fila.

  • tempdb debe disponer de suficiente espacio en disco para el almacenamiento de las versiones. Si existen transacciones de ejecución muy prolongada, todas las versiones generadas por las transacciones de actualización a lo largo del tiempo deben guardarse en tempdb. Si tempdb se queda sin espacio, no se producen errores en las operaciones de actualización, pero es posible que surjan errores en las operaciones de lectura que utilizan el control de versión de filas.

  • La información de control de versión de filas requiere 14 bytes adicionales en la fila de la base de datos.

  • El rendimiento de las actualizaciones puede ser menor debido a la carga implicada en el mantenimiento de las versiones de filas. En las cargas de trabajo normales de OLTP, cada actualización cambia pocas filas en una base de datos. En estos sistemas, el rendimiento de las actualizaciones en una base de datos donde las opciones están establecidas en ON será ligeramente inferior comparado con las bases de datos con las opciones establecidas en OFF. El costo de rendimiento de las actualizaciones de versiones podría ser superior cuando cambian grandes cantidades de datos durante las operaciones de actualización.

  • Las lecturas de datos deben hacer frente al costo adicional que supone recorrer la lista de vínculos de versiones. Cuanto más antigua sea la instantánea, más lento será su acceso en una transacción de aislamiento de instantáneas.

  • Puede que algunas transacciones de actualización que utilizan el aislamiento de instantáneas deban revertirse debido a la detección de conflictos en las operaciones de actualización. Las transacciones que se ejecuten en el aislamiento de lectura confirmada que utiliza el control de versión de filas no generan conflictos de actualización.

Las transacciones que utilizan el control de versión de filas están sujetas a otras limitaciones. Para obtener más información, vea Usar niveles de aislamiento basado en versiones de filas.

Sistemas que se benefician de los niveles de aislamiento basados en el control de versión de filas

Entre los escenarios que se benefician de los niveles de aislamiento basados en el control de versión de filas se incluyen:

  • Los sistemas donde los informes de sólo lectura y las consultas ad hoc se ejecutan en paralelo con una aplicación que actualiza los datos.

  • La migración de aplicaciones a Microsoft SQL Server Database Engine (Motor de base de datos de SQL Server) desde otros sistemas de bases de datos relacionales que admitan niveles de aislamiento similares.

  • Sistemas en los que la obtención de agregados coherentes, como AVG, COUNT y SUM, o la realización de intersecciones de índices y combinaciones de índices, requieren un nivel de aislamiento estricto (como las lecturas repetidas o en serie).

  • Sistemas que disponen de un gran número de interbloqueos debido a contenciones de lectura/escritura.