Comme le dit brb tea, cela dépend de l'implémentation de la base de données et de l'algorithme utilisé : MVCC ou verrouillage à deux phases.
CUBRID (SGBD open source) explique l'idée de ces deux algorithmes :
- Verrouillage biphasé (2PL)
La première est lorsque la transaction T2 tente de modifier l'enregistrement A, elle sait que la transaction T1 a déjà changé l'enregistrement A et attend jusqu'à ce que la transaction T1 soit terminée parce que la transaction T2 ne peut pas savoir si la transaction T1 sera validée ou annulée. retour. Cette méthode est appelée verrouillage en deux phases (2PL).
- Contrôle de concurrence multi-version (MVCC)
L'autre consiste à permettre à chacune d'entre elles, les transactions T1 et T2, de d'avoir leurs propres versions modifiées. Même si la transaction T1 a a changé l'enregistrement A de 1 à 2, la transaction T1 laisse la la valeur originale 1 telle quelle et écrit que la version de la transaction T1 est 2. de l'enregistrement A est 2. Ensuite, la transaction T2 suivante modifie l'enregistrement A de 1 à 3, mais pas de 1 à 3. de 1 à 3, et non de 2 à 4, et écrit que la version de transaction T2 de l'enregistrement A est 3. de l'enregistrement A est 3.
Lorsque la transaction T1 est annulée, il importe peu que la transaction 2, la version de la transaction T1, n'est pas appliquée à l'enregistrement A. Après Après cela, si la transaction T2 est validée, la version 3 de la transaction sera appliquée à l'enregistrement A. Si la transaction T1 est validée avant la transaction T2, l'enregistrement A est modifié en 2, puis en 3 au moment de la validation de la transaction T2. L'état final final de la base de données est identique à celui de l'exécution de chaque transaction indépendamment, sans aucun impact sur les autres transactions. Par conséquent, il satisfait à la propriété ACID. Cette méthode est appelée Contrôle de concurrence multi-version (MVCC).
La MVCC autorise les modifications simultanées au prix d'une augmentation de la charge de travail en mémoire (parce qu'elle doit maintenir différentes versions des mêmes données) et en calcul (au niveau REPETEABLE_READ, vous ne pouvez pas perdre les mises à jour, elle doit donc vérifier les versions des données, comme le fait Hiberate avec Verrouillage Optimistick ).
En 2PL Les niveaux d'isolement des transactions contrôlent les éléments suivants :
-
Si des verrous sont pris lorsque les données sont lues, et quel type de verrous sont demandés.
-
Combien de temps les verrous de lecture sont maintenus.
-
Si une opération de lecture faisant référence à des lignes modifiées par une autre transaction :
-
Bloque jusqu'à ce que le verrou exclusif sur la rangée soit libéré.
-
Récupère la version validée de la ligne qui existait au moment où la déclaration ou la transaction a commencé.
-
Lire la modification des données non engagées.
Le choix d'un niveau d'isolation des transactions n'affecte pas les verrous qui sont acquis pour protéger les modifications de données. Une transaction obtient toujours un verrou exclusif sur les données qu'elle modifie et le conserve jusqu'à la fin de la jusqu'à ce que la transaction soit terminée, quel que soit le niveau d'isolation défini pour cette transaction. Pour les opérations de lecture, les niveaux d'isolation des transactions définissent principalement le niveau de protection contre les effets des modifications apportées par d'autres transactions.
Un niveau d'isolation plus faible augmente la capacité de nombreux utilisateurs à accéder à aux données en même temps, mais augmente le nombre d'effets de concurrence effets tels que les lectures erronées ou les mises à jour perdues, que les utilisateurs peuvent rencontrer.
Des exemples concrets de la relation entre les verrous et les niveaux d'isolement dans SQL Server (utiliser 2PL sauf sur READ_COMMITED avec READ_COMMITTED_SNAPSHOT=ON)
-
READ_UNCOMMITED : n'émet pas de verrous partagés pour empêcher les autres transactions de modifier les données lues par la transaction en cours. Les transactions READ UNCOMMITTED ne sont pas non plus bloquées par des verrous exclusifs qui empêcheraient la transaction actuelle de lire des lignes qui ont été modifiées mais non validées par d'autres transactions. [...]
-
READ_COMMITED :
- Si READ_COMMITTED_SNAPSHOT a la valeur OFF (par défaut) : utilise des verrous partagés pour empêcher d'autres transactions de modifier des lignes pendant que la transaction actuelle exécute une opération de lecture. Les verrous partagés bloquent également l'instruction de lecture des rangées modifiées par d'autres transactions jusqu'à ce que l'autre transaction soit terminée. [...] Les verrous de rangée sont libérés avant le traitement de la rangée suivante. [...]
- Si le paramètre READ_COMMITTED_SNAPSHOT est défini sur ON, le moteur de base de données utilise le versionnage de ligne pour présenter à chaque instruction un instantané transactionnellement cohérent des données telles qu'elles existaient au début de l'instruction. Les verrous ne sont pas utilisés pour protéger les données des mises à jour effectuées par d'autres transactions.
-
REPETEABLE_READ : Des verrous partagés sont placés sur toutes les données lues par chaque instruction de la transaction et sont maintenus jusqu'à la fin de la transaction.
-
SERIALIZABLE : Les verrous de plage sont placés dans la plage des valeurs de clés qui correspondent aux conditions de recherche de chaque instruction exécutée dans une transaction. [...] Les verrous de plage sont maintenus jusqu'à ce que la transaction soit terminée.