Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Opérations d’écriture et de lecture/écriture
Vous pouvez gérer le comportement spécifique des opérations d’écriture simultanées en décidant quand et comment exécuter différents types de commandes. Les commandes suivantes sont pertinentes pour cette discussion :
-
COPYcommandes, qui effectuent des chargements (initiaux ou incrémentiels)
-
INSERTcommandes qui ajoutent une ou plusieurs lignes à la fois
-
UPDATEcommandes, qui modifient les lignes existantes
-
DELETEcommandes, qui suppriment des lignes
COPYet les INSERT opérations sont de pures opérations d'écriture, mais DELETE les UPDATE opérations sont des opérations de lecture/écriture. (Pour que des lignes soient supprimées ou mises à jour, elles doivent d’abord être lues.) Les résultats des opérations d’écriture simultanées dépendent des commandes spécifiques qui sont exécutées simultanément. COPYet les INSERT opérations sur la même table sont maintenues en attente jusqu'à ce que le verrou soit relâché, puis elles se déroulent normalement.
UPDATEet DELETE les opérations se comportent différemment car elles reposent sur une lecture initiale de la table avant toute écriture. Étant donné que les transactions simultanées sont invisibles les unes pour UPDATEs les autres, les deux DELETEs doivent lire un instantané des données du dernier commit. Lorsque le premier UPDATE ou DELETE relâche son verrou, le second UPDATE DELETE doit déterminer si les données avec lesquelles il va fonctionner sont potentiellement périmées. Elles ne le sont pas, car la deuxième transaction n’obtient pas son instantané des données tant que la première transaction n’a pas libéré son verrou.
Situation de blocage potentiel pour les transactions d’écriture simultanées
Chaque fois que les transactions impliquent des mises à jour de plusieurs tables, il y a toujours la possibilité que les transactions soient bloquées quand elles essaient d’écrire sur le même ensemble de tables. Une transaction libère tous les verrous de table à la fois lors d’une validation ou d’une annulation ; elle ne les libère pas un à la fois.
Par exemple, supposons que les transactions T1 et T2 commencent approximativement en même temps. Si T1 commence par écrire sur la table A et que T2 écrit sur la table B, les deux transactions peuvent se poursuivre sans conflit ; cependant, si T1 finit d’écrire sur la table A et doit commencer à écrire sur la table B, elle ne sera pas en mesure de poursuivre, car T2 continue de maintenir le verrou sur B. A l’inverse, si T2 finit d’écrire sur la table B et doit commencer à écrire sur la table A, elle n’est pas en mesure de poursuivre, car T1 continue de maintenir le verrou sur A. Comme aucune transaction ne peut libérer les verrous tant que toutes les opérations d’écriture ne sont pas validées, aucune transaction ne peut se poursuivre.
Afin d’éviter ce genre de blocage, vous devez planifier soigneusement les opérations d’écriture simultanées. Par exemple, vous devez toujours mettre à jour les tables dans le même ordre dans les transactions et, si vous spécifiez des verrous, verrouillez les tables dans le même ordre avant d'effectuer DML des opérations.