Oracle
 sql >> Base de données >  >> RDS >> Oracle

Quelle est la différence entre la lecture non répétable et la lecture fantôme ?

De Wikipédia (qui a d'excellents exemples détaillés pour cela):

Une lecture non répétable se produit lorsqu'au cours d'une transaction, une ligne est extraite deux fois et que les valeurs de la ligne diffèrent d'une lecture à l'autre.

et

Une lecture fantôme se produit lorsque, au cours d'une transaction, deux requêtes identiques sont exécutées et que la collection de lignes renvoyées par la deuxième requête est différente de la première.

Exemples simples :

  • L'utilisateur A exécute la même requête deux fois.
  • Entre-temps, l'utilisateur B exécute une transaction et valide.
  • Lecture non répétable :la ligne A interrogée par l'utilisateur A a une valeur différente la deuxième fois.
  • Lecture fantôme :toutes les lignes de la requête ont la même valeur avant et après, mais différentes lignes sont sélectionnées (parce que B en a supprimé ou inséré). Exemple :select sum(x) from table; renverra un résultat différent même si aucune des lignes concernées elles-mêmes n'a été mise à jour, si des lignes ont été ajoutées ou supprimées.

Dans l'exemple ci-dessus, quel niveau d'isolement utiliser ?

Le niveau d'isolation dont vous avez besoin dépend de votre application. Il y a un coût élevé à un "meilleur" niveau d'isolement (comme une simultanéité réduite).

Dans votre exemple, vous n'aurez pas de lecture fantôme, car vous ne sélectionnez qu'une seule ligne (identifiée par la clé primaire). Vous pouvez avoir des lectures non répétables, donc si c'est un problème, vous voudrez peut-être avoir un niveau d'isolement qui empêche cela. Dans Oracle, la transaction A peut également émettre un SELECT FOR UPDATE, puis la transaction B ne peut pas modifier la ligne tant que A n'est pas terminé.