- Lectures incorrectes : lire les données NON COMMISES d'une autre transaction
- Lectures non répétables : lire les données COMMITTED à partir d'une
UPDATE
requête d'une autre transaction
- Lecture fantôme : lecture des données COMMITTED à partir d'unerequête
INSERT
ouDELETE
d'une autre transaction
Remarque : les instructions DELETE d'une autre transaction ont également une très faible probabilité de provoquer des lectures non répétables dans certains cas. Cela se produit lorsque l'instruction DELETE, malheureusement, supprime la même ligne que votre transaction actuelle interrogeait. Mais c'est un cas rare, et beaucoup plus improbable dans une base de données contenant des millions de lignes dans chaque table. Les tables contenant des données de transaction ont généralement un volume de données élevé dans n'importe quel environnement de production.
Nous pouvons également observer que les MISES À JOUR peuvent être un travail plus fréquent dans la plupart des cas d'utilisation plutôt que de réelles INSERT ou DELETES (dans de tels cas, le danger de lectures non répétables reste seulement - les lectures fantômes ne sont pas possibles dans ces cas). C'est pourquoi UPDATES est traité différemment de INSERT-DELETE et l'anomalie résultante est également nommée différemment.
Il existe également un coût de traitement supplémentaire associé à la gestion des INSERT-DELETE, plutôt qu'à la gestion des MISES À JOUR.
- READ_UNCOMMITTED n'empêche rien. C'est le niveau d'isolement zéro
- READ_COMMITTED n'en empêche qu'une seule, c'est-à-dire des lectures incorrectes
- REPEATABLE_READ empêche deux anomalies: lectures incorrectes et lectures non répétables
- SERIALIZABLE empêche les trois anomalies: lectures sales, lectures non répétables et lectures fantômes
Alors pourquoi ne pas simplement définir la transaction SERIALIZABLE à tout moment? Eh bien, la réponse à la question ci-dessus est: le paramètre SERIALIZABLE rend les transactions très lentes , ce que nous ne voulons pas non plus.
En fait, la consommation de temps de transaction est au taux suivant:
SERIALIZABLE > REPEATABLE_READ > READ_COMMITTED > READ_UNCOMMITTED
Le paramètre READ_UNCOMMITTED est donc le plus rapide .
Résumé
En fait, nous devons analyser le cas d'utilisation et décider d'un niveau d'isolement afin d'optimiser le temps de transaction et d'éviter la plupart des anomalies.
Notez que les bases de données par défaut ont le paramètre REPEATABLE_READ.