Différence entre commit de lecture et lecture répétable

Je pense que les niveaux d’isolement ci-dessus sont similaires. Quelqu’un pourrait-il s’il vous plaît décrire avec quelques bons exemples quelle est la principale différence?

Lire commis est un niveau d’isolation qui garantit que toutes les données lues ont été validées au moment de la lecture. Cela empêche simplement le lecteur de voir une lecture intermédiaire, non validée, «sale». Le service informatique ne fait aucune promesse que si la transaction réémet la lecture, trouvera les mêmes données, les données sont libres de changer après leur lecture.

La lecture répétable est un niveau d’isolation supérieur, qui, outre les garanties du niveau de lecture engagé, garantit également que toute lecture de données ne peut pas changer , si la transaction lit à nouveau les mêmes données, elle trouvera les données précédemment lues, inchangées , et disponible pour lire.

Le niveau d’isolation suivant, sérialisable, offre une garantie encore plus forte: en plus de toutes les garanties de lecture reproductibles, il garantit également qu’aucune nouvelle donnée ne peut être vue par une lecture ultérieure.

Disons que vous avez une table T avec une colonne C avec une ligne, par exemple, elle a la valeur ‘1’. Et considérez que vous avez une tâche simple comme suit:

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

C’est une tâche simple qui émet deux lectures à partir de la table T, avec un délai de 1 minute entre elles.

  • sous READ COMITTED, le second SELECT peut renvoyer des données. Une transaction simultanée peut mettre à jour l’enregistrement, le supprimer, insérer de nouveaux enregistrements. La seconde sélection verra toujours les nouvelles données.
  • sous REPEATABLE READ, le deuxième SELECT est garanti pour voir les lignes qui ont été vues au premier coup, sélectionnez inchangé . De nouvelles lignes peuvent être ajoutées par une transaction simultanée dans cette minute, mais les lignes existantes ne peuvent pas être supprimées ni modifiées.
  • sous SERIALIZABLE lit le deuxième choix est garanti pour voir exactement les mêmes lignes que le premier. Aucune ligne ne peut être modifiée, ni supprimée, et aucune nouvelle ligne ne peut être insérée par une transaction simultanée.

Si vous suivez la logique ci-dessus, vous pouvez rapidement vous rendre compte que les transactions SERIALIZABLE, même si elles peuvent vous simplifier la vie, bloquent toujours complètement toutes les opérations simultanées, car elles nécessitent que personne ne puisse modifier, supprimer ou insérer de ligne. Le niveau d’isolation de transaction par défaut de l’étendue .Net System.Transactions est sérialisable, ce qui explique généralement les performances abyssales qui en résultent.

Et enfin, il y a aussi le niveau d’isolement SNAPSHOT. Le niveau d’isolement SNAPSHOT rend les mêmes garanties que sérialisables, mais pas en exigeant qu’aucune transaction simultanée ne puisse modifier les données. Au lieu de cela, il oblige chaque lecteur à voir sa propre version du monde (son propre «instantané»). Cela le rend très facile à programmer et très évolutif car il ne bloque pas les mises à jour simultanées. Cependant, cet avantage est associé à un prix: consommation de ressources serveur supplémentaire.

Lit supplémentaire:

  • Niveaux d’isolement dans le moteur de firebase database
  • Effets de concurrence
  • Choix des niveaux d’isolement basés sur la gestion des versions de lignes

Répétable Lire

L’état de la firebase database est conservé depuis le début de la transaction. Si vous récupérez une valeur dans session1, puis mettez à jour cette valeur dans session2, la récupérer à nouveau dans session1 renverra les mêmes résultats. Les lectures sont répétables.

 session1> BEGIN; session1> SELECT firstname FROM names WHERE id = 7; Aaron session2> BEGIN; session2> SELECT firstname FROM names WHERE id = 7; Aaron session2> UPDATE names SET firstname = 'Bob' WHERE id = 7; session2> SELECT firstname FROM names WHERE id = 7; Bob session2> COMMIT; session1> SELECT firstname FROM names WHERE id = 7; Aaron 

Lire commise

Dans le contexte d’une transaction, vous récupérerez toujours la dernière valeur validée. Si vous récupérez une valeur dans session1, mettez-la à jour dans session2, puis récupérez-la dans session1again, vous obtiendrez la valeur modifiée dans session2. Il lit la dernière ligne validée.

 session1> BEGIN; session1> SELECT firstname FROM names WHERE id = 7; Aaron session2> BEGIN; session2> SELECT firstname FROM names WHERE id = 7; Aaron session2> UPDATE names SET firstname = 'Bob' WHERE id = 7; session2> SELECT firstname FROM names WHERE id = 7; Bob session2> COMMIT; session1> SELECT firstname FROM names WHERE id = 7; Bob 

Logique?

Simplement la réponse à ma lecture et à ma compréhension de ce fil de discussion et de la réponse de @remus-rusanu est basée sur ce scénario simple:

Il existe deux processus A et B. Le processus B lit la table X Le processus A écrit dans la table X Le processus B lit à nouveau la table X.

  • ReadUncommitted : le processus B peut lire les données non validées du processus A et il peut voir différentes lignes basées sur l’écriture B. Pas de serrure du tout
  • ReadCommitted : le processus B peut lire UNIQUEMENT les données validées du processus A et il pourrait voir différentes lignes basées uniquement sur l’écriture B de COMMITTED. pourrions-nous l’appeler Simple Lock?
  • RepeatableRead : le processus B lit les mêmes données (lignes), quel que soit le processus A. Mais le processus A peut modifier d’autres lignes. Niveau des lignes
  • Serialisable : le processus B lit les mêmes lignes que précédemment et le processus A ne peut ni lire ni écrire dans la table. Bloc de niveau table
  • Instantané : chaque processus a sa propre copie et travaille dessus. Chacun a sa propre vue

Ancienne question qui a déjà une réponse acceptée, mais j’aime bien penser à ces deux niveaux d’isolement en termes de modification du comportement de locking dans SQL Server. Cela pourrait être utile pour ceux qui déboguent les blocages comme je l’étais.

READ COMMITTED (par défaut)

Les verrous partagés sont pris dans le SELECT, puis libérés lorsque l’instruction SELECT se termine . C’est ainsi que le système peut garantir qu’il n’ya pas de mauvaises lectures de données non validées. D’autres transactions peuvent toujours modifier les lignes sous-jacentes une fois votre sélection terminée et avant la fin de votre transaction.

REPEATABLE READ

Les verrous partagés sont pris dans le SELECT, puis libérés uniquement après la fin de la transaction . C’est ainsi que le système peut garantir que les valeurs que vous lisez ne changeront pas pendant la transaction (car elles restnt verrouillées jusqu’à la fin de la transaction).

Essayer d’expliquer ce doute avec des diagrammes simples.

Read Committed: Dans ce niveau d’isolement, la transaction T1 lit la valeur mise à jour du X validée par la transaction T2.

Lire commise

Lecture répétable: dans ce niveau d’isolation, la transaction T1 ne prend pas en compte les modifications validées par la transaction T2.

entrer la description de l'image ici

Mon observation sur la solution initiale acceptée.

Sous RR (par défaut mysql) – Si un tx est ouvert et qu’un SELECT a été déclenché, un autre tx ne peut supprimer aucune ligne appartenant au précédent jeu de résultats READ avant que la précédente tx ne soit validée (en fait, l’instruction delete dans le nouveau tx , cependant, le tx suivant peut supprimer toutes les lignes de la table sans aucun problème. Btw, une prochaine READ dans tx précédente verra toujours les anciennes données jusqu’à ce qu’elle soit validée.