Opérations d’écriture et de lecture/écriture - Amazon Redshift

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 :

  • Les commandes COPY, qui effectuent les chargements (initiaux ou incrémentiels)

  • Les commandes INSERT qui ajoutent une ou plusieurs lignes à la fois

  • Les commandes UPDATE, qui modifient les lignes existantes

  • Les commandes DELETE, qui suppriment des lignes

Les opérations COPY et INSERT sont de pures opérations d’écriture, mais les opérations DELETE et UPDATE 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. Les opérations COPY et INSERT sur la même table sont conservées dans un état d’attente jusqu’à la libération du verrou, puis se poursuivent normalement.

Les opérations UPDATE et DELETE se comportent différemment, car elles s’appuient sur une table initiale lue avant toute écriture. Comme les transactions simultanées sont invisibles les unes aux autres, les opérations UPDATE and DELETE doivent lire un instantané des données depuis la dernière validation. Lorsque la première opération UPDATE ou DELETE libère son verrou, la deuxième opération UPDATE ou DELETE doit déterminer si les données qu’il va utiliser sont potentiellement obsolètes. 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 des transactions et, si vous spécifiez des verrous, verrouillez les tables dans le même ordre avant d’effectuer les opérations DML.