¿Cuál es la diferencia entre lectura no repetible y lectura fantasma?
He leído el artículo de Aislamiento (sistemas de bases de datos) de Wikipedia , pero tengo algunas dudas. En el siguiente ejemplo, ¿qué sucederá: la lectura no repetible y la lectura fantasma ?
Transacción ASELECT ID, USERNAME, accountno, amount FROM USERS WHERE ID=1
SALIDA:
1----MIKE------29019892---------5000
Transacción B
UPDATE USERS SET amount=amount+5000 where ID=1 AND accountno=29019892;
COMMIT;
Transacción A
SELECT ID, USERNAME, accountno, amount FROM USERS WHERE ID=1
Otra duda es, en el ejemplo anterior, ¿qué nivel de aislamiento debe usarse? ¿Y por qué?
database
oracle
transactions
isolation-level
transaction-isolation
usuario1357722
fuente
fuente
Respuestas:
De Wikipedia (que tiene ejemplos excelentes y detallados para esto):
y
Ejemplos simples:
select sum(x) from table;
devolverá un resultado diferente incluso si ninguna de las filas afectadas se ha actualizado, si se han agregado o eliminado filas.El nivel de aislamiento que necesita depende de su aplicación. Hay un alto costo para un "mejor" nivel de aislamiento (como la concurrencia reducida).
En su ejemplo, no tendrá una lectura fantasma, porque selecciona solo de una sola fila (identificada por la clave primaria). Puede tener lecturas no repetibles, por lo que si eso es un problema, es posible que desee tener un nivel de aislamiento que lo impida. En Oracle, la transacción A también podría emitir un SELECCIONAR PARA ACTUALIZAR, luego la transacción B no puede cambiar la fila hasta que A haya terminado.
fuente
Una forma simple en la que me gusta pensar es:
Tanto las lecturas no repetibles como las fantasmas tienen que ver con las operaciones de modificación de datos de una transacción diferente, que se confirmaron después de que comenzó su transacción, y luego fueron leídas por su transacción.
Las lecturas no repetibles son cuando su transacción lee ACTUALIZACIONES confirmadas de otra transacción. La misma fila ahora tiene valores diferentes a los que tenía cuando comenzó su transacción.
Las lecturas fantasmas son similares, pero cuando se leen de INSERTOS y / o BORRADOS comprometidos de otra transacción. Hay nuevas filas o filas que han desaparecido desde que comenzó la transacción.
Las lecturas sucias son similares a las lecturas no repetibles y fantasmas, pero se relacionan con la lectura de datos NO COMPROMETIDOS, y ocurren cuando se lee una ACTUALIZACIÓN, INSERCIÓN o ELIMINACIÓN de otra transacción, y la otra transacción aún NO ha confirmado los datos. Está leyendo datos "en progreso", que pueden no estar completos y que en realidad nunca se pueden confirmar.
fuente
Como se explica en este artículo , la anomalía de lectura no repetible es la siguiente:
En este artículo sobre Phantom Read , puede ver que esta anomalía puede ocurrir de la siguiente manera:
Entonces, mientras que la Lectura no repetible se aplica a una sola fila, la Lectura fantasma trata sobre un rango de registros que satisfacen un criterio de filtrado de consultas dado.
fuente
Leer fenómenos
UPDATE
consulta de otra transacciónINSERT
oDELETE
de otra transacciónNota : Las declaraciones DELETE de otra transacción también tienen una probabilidad muy baja de causar lecturas no repetibles en ciertos casos. Ocurre cuando la declaración DELETE, desafortunadamente, elimina la misma fila que estaba consultando su transacción actual. Pero este es un caso raro, y es mucho más improbable que ocurra en una base de datos que tiene millones de filas en cada tabla. Las tablas que contienen datos de transacciones generalmente tienen un alto volumen de datos en cualquier entorno de producción.
También podemos observar que las ACTUALIZACIONES pueden ser un trabajo más frecuente en la mayoría de los casos de uso en lugar de INSERT o DELETES reales (en tales casos, el peligro de lecturas no repetibles solo permanece; las lecturas fantasmas no son posibles en esos casos). Esta es la razón por la cual las ACTUALIZACIONES se tratan de manera diferente a INSERT-DELETE y la anomalía resultante también se denomina de manera diferente.
También hay un costo de procesamiento adicional asociado con el manejo de INSERT-DELETEs, en lugar de solo manejar las ACTUALIZACIONES.
Beneficios de diferentes niveles de aislamiento.
Entonces, ¿por qué no simplemente configurar la transacción SERIALIZABLE en todo momento? Bueno, la respuesta a la pregunta anterior es: la configuración SERIALIZABLE hace que las transacciones sean muy lentas , lo que nuevamente no queremos.
De hecho, el consumo de tiempo de transacción está en la siguiente tasa:
Entonces, la configuración READ_UNCOMMITTED es la más rápida .
Resumen
En realidad, necesitamos analizar el caso de uso y decidir un nivel de aislamiento para optimizar el tiempo de transacción y también prevenir la mayoría de las anomalías.
Tenga en cuenta que las bases de datos por defecto tienen la configuración REPEATABLE_READ.
fuente
Hay una diferencia en la implementación entre estos dos tipos de niveles de aislamiento.
Para "lectura no repetible", se necesita el bloqueo de fila.
Para "lectura fantasma", se necesita un bloqueo de alcance, incluso un bloqueo de tabla.
Podemos implementar estos dos niveles utilizando el protocolo de bloqueo de dos fases .
fuente
En un sistema con lecturas no repetibles, el resultado de la segunda consulta de la Transacción A reflejará la actualización en la Transacción B: verá la nueva cantidad.
En un sistema que permite lecturas fantasma, si la Transacción B inserta una nueva fila con ID = 1, la Transacción A verá la nueva fila cuando se ejecute la segunda consulta; es decir, las lecturas fantasmas son un caso especial de lectura no repetible.
fuente
La respuesta aceptada indica sobre todo que la llamada distinción entre los dos en realidad no es significativa en absoluto.
Si "se recupera una fila dos veces y los valores dentro de la fila difieren entre las lecturas", entonces no son la misma fila (no la misma tupla en el lenguaje RDB correcto) y, por definición, también es el caso que "la colección de las filas devueltas por la segunda consulta son diferentes de la primera ".
En cuanto a la pregunta "qué nivel de aislamiento se debe usar", cuanto más importantes sean sus datos para alguien, en algún lugar, más será el caso de que Serializable es su única opción razonable.
fuente
Creo que hay alguna diferencia entre la lectura no repetible y la lectura fantasma.
No repetible significa que hay una transacción de remolque A y B. si B puede notar la modificación de A, por lo que tal vez suceda una lectura sucia, por lo que permitimos que B note la modificación de A después de que A se compromete.
Hay un nuevo problema: dejamos que B note la modificación de A después de que A se compromete, significa que A modifica un valor de fila que B tiene, a veces B leerá la fila nuevamente, por lo que B obtendrá un nuevo valor diferente con la primera vez que get, lo llamamos No repetible, para tratar el problema, dejamos que B recuerde algo (porque todavía no sé lo que se recordará) cuando B comienza.
Pensemos en la nueva solución, también podemos notar que hay un nuevo problema, porque dejamos que B recuerde algo, así que, pase lo que pase en A, B no puede verse afectada, pero si B quiere insertar algunos datos en la tabla y B verifique la tabla para asegurarse de que no haya ningún registro, pero A ha insertado estos datos, por lo que puede ocurrir algún error. Lo llamamos Phantom-read.
fuente
la lectura no repetible es un nivel de aislamiento y la lectura fantasma (lectura del valor comprometido por otras transacciones) es un concepto (tipo de lectura, por ejemplo, lectura sucia o lectura de instantánea). El nivel de aislamiento de lectura no repetible permite lectura fantasma pero no lecturas sucias o lecturas de instantáneas.
fuente