SQL Server: ¿qué nivel de aislamiento para las instrucciones de selección sin bloqueo?

9

Tengo una transacción de larga duración (llamada, por ejemplo, T1) que realiza algunas eliminaciones, actualizaciones e inserciones en una tabla en SQL Server 2008 R2. Al mismo tiempo, otro proceso ejecuta periódicamente sentencias select de esta tabla.

Bajo la configuración de aislamiento predeterminada (¿LEÍDO COMPROMETIDO, creo?), T1 bloquea cualquier declaración de selección hasta que la transacción se confirme o se revierta.

Lo que me gustaría ver es que las declaraciones select funcionen en datos consistentes incluso mientras la transacción está en curso. Creo que el aislamiento SNAPSHOT puede ayudar, pero no estoy seguro de si voy en la dirección correcta. ¿Sería este el mejor nivel de aislamiento para esta aplicación?

En segundo lugar, no tengo ningún control sobre el proceso que está llamando a las instrucciones select, pero sí tengo control sobre la aplicación .NET que llama a T1. ¿Se requerirían cambios en el nivel de aislamiento tanto en las declaraciones select como en T1, o sería suficiente marcar solo T1 como teniendo un nivel de aislamiento diferente?

crecer
fuente

Respuestas:

8

En un mundo ideal, tendría dos opciones, SNAPSHOT y READ COMMITTED SNAPSHOT (RCSI). Asegúrese de comprender los conceptos básicos de los niveles de aislamiento de transacciones antes de decidir cuál es el adecuado para su carga de trabajo. Específicamente, tenga en cuenta los diferentes resultados que puede ver como resultado de pasar a RCSI.

Parece que no es un mundo ideal, ya que no tiene ningún control sobre la aplicación que genera las declaraciones de selección. En ese caso, su única opción es habilitar RCSI para la base de datos en cuestión de modo que los seleccionados usen automáticamente RCSI en lugar de LEER COMPROMETIDO.

Mark Storey-Smith
fuente
6

Correcto, use el aislamiento SNAPSHOT para obtener datos consistentes y comprometidos antes de que comenzara la transacción.

El aislamiento LEER NO COMPROMETIDO (también conocido como sugerencia NOLOCK) leerá datos inconsistentes y sucios

Cuando habilita el aislamiento SNAPSHOT, surte efecto para todos los SELECT en adelante. Corres ALTER DATABASEcon READ_COMMITTED_SNAPSHOT en este caso

Editar: enlace agregado + cita de ALTER DATABASE (my bold)

Habilita la opción Instantánea confirmada de lectura en el nivel de la base de datos. Cuando está habilitado, las instrucciones DML comienzan a generar versiones de fila, incluso cuando ninguna transacción utiliza el aislamiento de instantáneas. Una vez que esta opción está habilitada, las transacciones que especifican el nivel de aislamiento confirmado de lectura utilizan versiones de fila en lugar de bloqueo. Cuando una transacción se ejecuta en el nivel de aislamiento de lectura confirmada, todas las declaraciones ven una instantánea de los datos tal como existen al comienzo de la declaración.

Y del uso de aislamiento de instantáneas (mi negrita)

La opción de base de datos READ_COMMITTED_SNAPSHOT determina el comportamiento del nivel de aislamiento predeterminado READ COMMITTED cuando el aislamiento de instantánea está habilitado en una base de datos. Si no especifica explícitamente READ_COMMITTED_SNAPSHOT ON, READ COMMITTED se aplica a todas las transacciones implícitas. Esto produce el mismo comportamiento que establecer READ_COMMITTED_SNAPSHOT OFF (el valor predeterminado). Cuando READ_COMMITTED_SNAPSHOT OFF está vigente, el Motor de base de datos usa bloqueos compartidos para imponer el nivel de aislamiento predeterminado. Si establece la opción de base de datos READ_COMMITTED_SNAPSHOT en ON, el motor de la base de datos usa el control de versiones de filas y el aislamiento de instantáneas como predeterminado, en lugar de usar bloqueos para proteger los datos.

Entonces sí.

Habilitar RCSI permitirá que las lecturas obtengan datos consistentes y no sean bloqueadas por escritores que continuarán usando Read Committed

gbn
fuente
4

Le sugiero que lea la siguiente pregunta y sus respuestas: ¿Problemas de bloqueo de la base de datos? .

Encontrar el nivel de aislamiento adecuado para usar en el nivel de base de datos es lo más rápido que puede hacer en este momento para ayudarlo a solucionar este problema, porque ahora es difícil cambiar todas las aplicaciones que tocan la base de datos y cambiar su código. Como usted dijo "No tengo ningún control sobre el proceso que está llamando a las declaraciones de selección", la respuesta más rápida sería cambiar el nivel de aislamiento de DB a lectura de confirmación de lectura, para que no toque las consultas de lectura. De lo contrario, necesitaría usar el nivel de aislamiento de Instantáneas para las sesiones que leen datos durante sus grandes transacciones.

Más detalles aquí sobre cómo elegir el correcto: Elección de niveles de aislamiento basados ​​en versiones de fila .

Mariana
fuente