El nivel de aislamiento de las transacciones en SQL Server y su relación con lecturas sucias, lecturas no repetibles, lecturas fantasma, etc. (argumentos de código y secuencias temporales)
Entendiendo estos problemas que pueden surgir en el caso de acceso concurrente a la base de datos, podemos seguir entendiendo el concepto de nivel de aislamiento de la base de datos, en términos sencillos: ¿cómo se quiere aislar las transacciones concurrentes y en qué medida? Por ejemplo, si se toleran lecturas sucias, o si no quieres que las transacciones concurrentes tengan lecturas sucias, entonces estas pueden configurarse al nivel de aislamiento para que el aislamiento entre transacciones concurrentes sea laxo o grave.
Cuanto mayor es el nivel de aislamiento, menor es la probabilidad de leer datos sucios o incompletos, pero mayor es la degradación del rendimiento en sistemas de alta concurrencia. Cuanto menor sea el nivel de aislamiento, mayor será la mejora de rendimiento en el sistema concurrente, pero los datos en sí pueden estar incompletos.
En SQL Server 2012, puedes establecer el nivel de aislamiento de una transacción (de bajo a alto) usando esta sintaxis:
ESTABLECER NIVEL DE AISLAMIENTO DE TRANSACCIONES { LEER SIN COMPROMETERSE | LEER COMPROMETIDO | LECTURA REPETIBLE | INSTANTÁNEA | SERIALIZABLE } [ ; ] Primero, crea un nuevo script de prueba, crea una base de datos e inserta los datos de prueba, de la siguiente manera:
Crear una nueva ventana A, abre una transacción, realiza la operación de actualización y espera 10 segundos antes de comprometer, el código es el siguiente:
Crear una nueva ventana B, establece la transacción READ UNCOMMITTED (lectura no confirmada, el nivel más bajo, el problema fácil es la lectura sucia, porque puede leer los datos modificados por otras transacciones pero no comprometidos). Hace lo mismo que configurar (NOLOCK) en la tabla de objetos de la sentencia SELECT en una transacción. Consulta los datos, el código es el siguiente:
Crear una nueva ventana C, consulta directamente los datos, de la siguiente manera:
A su vez,Ejecuta ventanas A, B y C, y descubre que al actualizar datos, la ventana B puede devolver datos inmediatamente (Es posible que la lectura sea un dato corrupto), la ventana C necesita esperar a que la ventana A termine de ejecutarsedevolverá los datos, como se muestra en la figura siguiente:
(Ventana B)
(Ventana C)
(Fin)
|