sql >> Base de Datos >  >> RDS >> Oracle

¿Cuál es la diferencia entre lectura no repetible y lectura fantasma?

De Wikipedia (que tiene excelentes y detallados ejemplos de esto):

Se produce una lectura no repetible cuando, durante el curso de una transacción, una fila se recupera dos veces y los valores dentro de la fila difieren entre las lecturas.

y

Una lectura fantasma ocurre cuando, en el curso de una transacción, se ejecutan dos consultas idénticas y la colección de filas devuelta por la segunda consulta es diferente de la primera.

Ejemplos simples:

  • El usuario A ejecuta la misma consulta dos veces.
  • En el medio, el usuario B ejecuta una transacción y confirma.
  • Lectura no repetible:la fila A que el usuario A ha consultado tiene un valor diferente la segunda vez.
  • Lectura fantasma:todas las filas de la consulta tienen el mismo valor antes y después, pero se seleccionan filas diferentes (porque B ha eliminado o insertado algunos). Ejemplo: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.

En el ejemplo anterior, ¿qué nivel de aislamiento usar?

El nivel de aislamiento que necesita depende de su aplicación. Hay un alto costo para un nivel de aislamiento "mejor" (como una simultaneidad reducida).

En su ejemplo, no tendrá una lectura fantasma, porque selecciona solo de una sola fila (identificada por clave principal). 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 SELECCIONAR PARA ACTUALIZAR, luego la transacción B no puede cambiar la fila hasta que A termine.