sql >> Base de Datos >  >> RDS >> Sqlserver

Diferencia entre lectura confirmada y lectura repetible

Lectura confirmada es un nivel de aislamiento que garantiza que cualquier lectura de datos fue confirmada en este momento se lee. Simplemente impide que el lector vea cualquier lectura intermedia, no comprometida y 'sucia'. No promete en absoluto que si la transacción vuelve a emitir la lectura, encontrará el Igual datos, los datos son libres de cambiar después de leerlos.

La lectura repetible es un nivel de aislamiento más alto, que además de las garantías del nivel de lectura confirmada, también garantiza que cualquier dato leído no puede cambiar , si la transacción vuelve a leer los mismos datos, encontrará los datos leídos anteriormente en su lugar, sin cambios y disponibles para leer.

El siguiente nivel de aislamiento, serializable, ofrece una garantía aún más fuerte:además de todas las garantías de lectura repetible, también garantiza que no nuevo datos se puede ver en una lectura posterior.

Digamos que tiene una tabla T con una columna C con una fila, digamos que tiene el valor '1'. Y considera que tienes una tarea simple como la siguiente:

BEGIN TRANSACTION;
SELECT * FROM T;
WAITFOR DELAY '00:01:00'
SELECT * FROM T;
COMMIT;

Esa es una tarea simple que emite dos lecturas de la tabla T, con un retraso de 1 minuto entre ellas.

  • bajo LECTURA COMPROMETIDA, la segunda SELECCIÓN puede devolver cualquiera datos. Una transacción concurrente puede actualizar el registro, borrarlo, insertar nuevos registros. La segunda selección siempre verá el nuevo datos.
  • bajo LECTURA REPETIBLE, se garantiza que el segundo SELECT mostrará al menos las filas que se devolvieron del primer SELECT sin cambios . Se pueden agregar nuevas filas mediante una transacción simultánea en ese minuto, pero las filas existentes no se pueden eliminar ni cambiar.
  • bajo SERIALIZABLE lee, se garantiza que la segunda selección verá exactamente las mismas filas que la primera. Ninguna fila puede cambiar, ni eliminarse, ni pueden insertarse filas nuevas mediante una transacción simultánea.

Si sigue la lógica anterior, puede darse cuenta rápidamente de que las transacciones SERIALIZABLES, si bien pueden facilitarle la vida, siempre bloquean por completo todas las operaciones concurrentes posibles, ya que requieren que nadie pueda modificar, borrar o insertar ninguna fila. El nivel de aislamiento de transacción predeterminado de .Net System.Transactions El alcance es serializable, y esto generalmente explica el rendimiento abismal que resulta.

Y por último, también está el nivel de aislamiento SNAPSHOT. El nivel de aislamiento de SNAPSHOT ofrece las mismas garantías que el serializable, pero no requiere que ninguna transacción concurrente pueda modificar los datos. En cambio, obliga a cada lector a ver su propia versión del mundo (su propia "instantánea"). Esto hace que sea muy fácil de programar y muy escalable, ya que no bloquea las actualizaciones simultáneas. Sin embargo, ese beneficio tiene un precio:consumo adicional de recursos del servidor.

Lecturas complementarias:

  • Niveles de aislamiento en el motor de base de datos
  • Efectos de concurrencia
  • Elegir niveles de aislamiento basados ​​en el control de versiones de filas