La cohérence des bases de données est également l’un des indicateurs importants pour mesurer la performance du SGBD. Actuellement, la plupart des bases de données commerciales (DB2, SQL Server) utilisent le protocole Two-Phase Locking (2PL) pour le contrôle de la concurrence, qui assure la sérialisation de l’exécution concurrente des transactions. Cependant, le 2PL doit verrouiller toutes les données avant de pouvoir y lire ou écrire. Dans la matrice de compatibilité de blocage, les verrous S (verrous de partage) et X (verrous exclusifs) sont incompatibles, donc lorsque la transaction 1 effectue une opération de lecture sur les données A (plus un verrou S), et que la transaction 2 souhaite écrire sur les données (ajouter un verrou X), la transaction 2 doit attendre que la transaction 1 libère le verrou S sur les données A avant de continuer. Le contrôle de concurrence multi-versions (MVCC) résout bien ce problème. Dans un système multi-versions, chaque donnée d’écriture génère une nouvelle version, et l’opération de lecture peut lire la version appropriée selon les besoins, de sorte que les opérations de lecture et d’écriture ne se bloquent pas. MVCC augmente la concurrence, mais introduit aussi la surcharge de stockage liée à la maintenance de plusieurs versions.
Le moteur de base de données Microsoft SQL Server introduit une nouvelle implémentation du niveau d’isolation des transactions existant : les lectures engagées, qui fournissent des instantanés au niveau des instructions grâce au versionnement par lignes. Le moteur de base de données SQL Server introduit également un nouveau niveau d’isolation des transactions : des instantanés pour fournir des instantanés au niveau des transactions utilisant également le versionnement par lignes.
En activant l’option de base de données READ_COMMITTED_SNAPSHOT active l’isolation de lecture engagée grâce au versionnement des lignes. Activer l’option ALLOW_SNAPSHOT_ISOLATION base de données active active l’isolation des instantanés. Lorsque l’une ou l’autre option est activée pour la base de données, le moteur de base de données maintient la version de chaque ligne modifiée. Chaque fois qu’une transaction modifie une ligne, l’image de la ligne avant la modification est copiée sur une page du magasin des versions. Un magasin de versions est une collection de pages de données dans tempdb. S’il existe plusieurs lignes de modification de transaction, plusieurs versions de cette ligne seront liées dans une chaîne de versions. Une opération de lecture utilisant le versionnement de lignes récupère la dernière version de chaque ligne qui a été engagée au début de la transaction ou de l’état.
Les applications écrites pour SQL Server 2008 ou nouvelles sur SQL Server implémentent l’isolement des commits de lecture en utilisant le versionnement par lignes en spécifiant le niveau d’isolation des transactions pour les commits de lecture lorsque l’option de base de données READ_COMMITTED_SNAPSHOT est activée. Toutes les lectures consulteront la version de la ligne qui a été envoyée au début de la déclaration. Cela fournira un instantané au niveau de l’instruction des données.
Les applications écrites pour SQL Server implémenteront l’isolation des instantanés en spécifiant le niveau d’isolation des transactions instantanées lorsque l’option ALLOW_SNAPSHOT_ISOLATION base de données est activée. Toutes les lectures dans une transaction instantanée regarderont la version de la ligne qui a été engagée au début de la transaction. Cela fournira un instantané des données au niveau de la transaction.
Pour les transactions utilisant des niveaux d’isolation basés sur des lignes, les lectures ne demandent pas de verrous partagés sur les données. Cela signifie que les lecteurs utilisant le versionnage par lignes n’empêchent pas d’autres lecteurs ou auteurs d’accéder aux mêmes données. De même, l’écrivain ne gêne pas le lecteur. Cependant, les auteurs se gênent mutuellement (même lorsqu’ils fonctionnent à un certain niveau d’isolement basé sur le versionnement des lignes). Deux opérations d’écriture ne peuvent pas modifier les mêmes données en même temps.
La fonctionnalité Isolement des instantanés étend le cadre de verrouillage dans SQL Server 2008 en permettant aux applications de visualiser les valeurs avant toute modification des données. Cela empêche le blocage de l’application tout en fournissant les données véritablement soumises. Le Read Committed Snapshot de SQL Server 2008 nécessite l’activation d’un administrateur de base de données, permettant la lecture des données par des transactions en lecture seule. Ainsi, le contrôle de la concurrence par SI sur les transactions en lecture seule est très bon, mais il n’est pas clair si c’est le cas pour les transactions de mise à jour. Il est plus défavorable que les transactions de mise à jour à long terme soient en concurrence avec les transactions de haut niveau à court terme. Si une transaction entre bases de données tente d’utiliser la norme d’isolation instantanée (SI), plutôt que toutes les bases de données configurées, la transaction échoue. Cela crée sans aucun doute certains obstacles à l’évolutivité. Il semble que Microsoft ait encore beaucoup de chemin à parcourir pour atteindre son propre SI plus solide que la spécification SQL 92.
Avant toute modification, faites une copie de la version précédente, et toutes les opérations de lecture suivantes liront la version copiée, la modification créant une nouvelle version. De cette façon,Les opérations de lecture et d’écriture ne se bloquent pas mutuellement. L’avantage d’utiliser ce mécanisme de versionnement de lignes est que la concurrence du programme est relativement élevée, mais l’inconvénient est que, bien que l’utilisateur ne lise pas une donnée sale, elle peut être une valeur de données en cours de modification et sur le point d’expirer. Si vous modifiez les données en fonction de cette valeur expirée, cela provoquera une erreur logique。
Commandes SQL :
Liens de référence :
La connexion hyperlientérée est visible.
La connexion hyperlientérée est visible.
La connexion hyperlientérée est visible.
La connexion hyperlientérée est visible.
La connexion hyperlientérée est visible.
La connexion hyperlientérée est visible.
|